如何使用正则表达式来匹配特定类型单词之前的所有内容
我是正则表达式的新手。
是否有可能在满足特定条件的单词之前匹配所有内容:
例如:
这是一个测试 - - +++这是一个测试
我希望它遇到一个以大写字母开头的单词,下一个字符是小写的。这是一个恰当的词。然后,我想删除该词之前的所有内容。
上面的例子应该产生:这是一个测试
我只想进行这种处理,直到它找到正确的单词,然后停止。
任何帮助将不胜感激。
谢谢
我是正则表达式的新手。
是否有可能在满足特定条件的单词之前匹配所有内容:
例如:
这是一个测试 - - +++这是一个测试
我希望它遇到一个以大写字母开头的单词,下一个字符是小写的。这是一个恰当的词。然后,我想删除该词之前的所有内容。
上面的例子应该产生:这是一个测试
我只想进行这种处理,直到它找到正确的单词,然后停止。
任何帮助将不胜感激。
谢谢
取代
^.*?(?=[A-Z][a-z])
使用空字符串。这适用于 ASCII 输入。对于非 ASCII 输入(Unicode,其他语言),适用不同的策略。
解释
.*? Everything, until
(?= followed by
[A-Z] one of A .. Z and
[a-z] one of a .. z
)
支持 Java Unicode 的变体是这样的:
^.*?(?=\p{Lu}\p{Ll})
醒来一点后,您不需要删除任何内容,甚至不需要创建一个子组 - 只需找到答案中其他地方表达的模式即可。下面是一个完整的示例:
import java.util.regex.*;
public class Test
{
public static void main(String args[])
{
Pattern pattern = Pattern.compile("[A-Z][a-z].*");
String original = "THIS IS A TEST - - +++ This is a test";
Matcher match = pattern.matcher(original);
if (match.find())
{
System.out.println(match.group());
}
else
{
System.out.println("No match");
}
}
}
编辑:原始答案
这看起来像是在做正确的事情:
import java.util.regex.*;
public class Test
{
public static void main(String args[])
{
Pattern pattern = Pattern.compile("^.*?([A-Z][a-z].*)$");
String original = "THIS IS A TEST - - +++ This is a test";
String replaced = pattern.matcher(original).replaceAll("$1");
System.out.println(replaced);
}
}
基本上,诀窍不是忽略正确单词之前的所有内容 - 而是将所有内容从正确的单词开始分组,并用该组替换整个文本。
上述内容会失败,因为“我”不被认为是一个合适的词。如果要解决此问题,请将 [a-z] 更改为 [a-z\s],这将允许使用空格而不是字母。"*** FOO *** I am fond of peanuts"