我正在尝试匹配字符串中两个单词之间的一组单词。我将使用Java RegEx。
输入文字
The clever fox JUMPED OVER the big dog and ran away.
预期输出
the big
使用RegEx
(?<=(fox\s[A-Z0-9]*))(?s)(.*?)(?=\sdog)
我得到了输出,它给了我狐狸和狗之间的所有单词
JUMPED OVER the big
单词&#34; fox&#34; 后面会跟一个或多个全部大写单词。我需要匹配这两个单词之后的所有单词,直到我得到&#34; dog&#34; 。
此外,我需要在Capture Group 0中获得所需的输出。我不能使用不同的捕获组。这是我的申请中的限制。
非常感谢任何帮助。
答案 0 :(得分:1)
我害怕java doesn't support variable length look behind assertions。
另外capture group 0 is the full text由于不允许变长的lookbehinds(如前所述)是不可能的,除非你知道总会有一定长度的大写单词。
要使用捕获组1执行此操作,请尝试:
(?<=fox)(?:\s[A-Z0-9]*)*\s?(.*?)(?=\sdog)
编辑:修正了正则表达式中的拼写错误
编辑2:澄清全文问题。
编辑3:取决于愚蠢的java如何使用“非显而易见的最大长度的lookbehind组”,这可能有效:(?<=fox(?:\s[A-Z0-9]{5,7}){1,2})(.*?)(?=\sdog)
但是我需要问一下,是什么让你确信你需要这个才能被捕获0组?我有点怀疑是这样的,即使它确实如此,你可以只取出输出然后再次对.*
运行它来获得捕获组0的正则表达式,你真的不需要这个作为一个要求。
答案 1 :(得分:1)
您可以使用此正则表达式:
^.*fox[A-Z0-9\s]*(.*)dog.*$
您可以在函数中通过参数传递fox
和dog
,以便在其他情况下使用。
答案 2 :(得分:0)
没有正则表达式:
String fox = "The clever fox JUMPED OVER the big dog and ran away.";
boolean start = false;
for (String word : fox.split("\\s")) {
if ("fox".equals(word)) {
start = true;
continue;
}
if ("dog".equals(word)) {
break;
}
if (start) {
System.out.println(word);
}
}