我的问题是在两个单词之间找到一个单词。在这两个单词中,一个是全部大写单词,可以是任何单词,另一个单词是“是”。我尝试了几个正则表达式,但没有人帮助我。这是我的例子:
字符串:
In THE house BIG BLACK cat is very good.
预期产出:
cat
使用RegEx:
(?<=[A-Z]*\s)(.*?)(?=\sis)
上面的RegEx为我提供BIG BLACK cat
作为输出,而我只需要cat
。
答案 0 :(得分:3)
一种解决方案是简化你的正则表达式,
[A-Z]+\s(\w+)\sis
并仅使用匹配的组(即\1
)。 See it in action here.
由于你想出了一些更复杂的东西,我假设你理解了上述表达的所有部分,但是对于稍后会出现的人,这里有更多细节:
[A-Z]+
将匹配一个或多个大写字符\s
将匹配空格(\w+)
将匹配一个或多个字词([a-zA-Z0-9_]
)并将匹配存储在第一个匹配组中\s
将匹配空格is
将匹配“是”我的例子非常具体,可能因不同的输入而分解。您的问题没有提供有关您期望的其他输入的许多详细信息,因此我不相信我的解决方案适用于所有情况。
答案 1 :(得分:2)
您希望查找依赖于炎症的几个部分的条件,然后仅检索该信息的特定部分。如果没有分组,这在正则表达式中是不可能的。在Java中你应该这样做:
public class Main {
public static void main(String[] args) {
Pattern pattern = Pattern.compile("[A-Z]+\\s(\\w+)\\sis");
Matcher matcher = pattern.matcher("In THE house BIG BLACK cat is very good.");
if (matcher.find())
System.out.println(matcher.group(1));
}
}
}
group(1)
是围绕它的括号。在这种情况下w+
。这就是你的话。 group()
的返回类型为String
,因此您可以立即使用
答案 2 :(得分:2)
以下部分具有外部行为
(?<=[A-Z]*\s)(.*?)
由于某种原因,[A-Z]*
匹配空字符串。 (.*?)
与BIG BLACK
匹配。通过一些调整,我认为以下内容可行(但仍然可以匹配一些误报):
(?<=[A-Z]+\s)(\w+)(?=\sis)
一个稍微好一点的正则表达式是:
(?<=\b[A-Z]+\s)(\w+)(?=\sis)
希望有所帮助
答案 3 :(得分:2)
试试这个:
String TestInput = "In THE house BIG BLACK cat is very good.";
Pattern p = Pattern
.compile(
"(?<=\\b\\p{Lu}+\\s) # lookbehind assertion to ensure a uppercase word before\n"
+ "\\p{L}+ # matching at least one letter\n"
+ "(?=\\sis) # lookahead assertion to ensure a whitespace is ahead\n"
, Pattern.COMMENTS); Matcher m = p.matcher(TestInput);
if(m.find())
System.out.println(m.group(0));
它只匹配“cat”。
对于任何语言的信件, \p{L}
都是Unicode property。
\p{Lu}
都是Unicode property。
答案 4 :(得分:0)
String m = "In THE house BIG BLACK cat is very good.";
Pattern p = Pattern.compile("[A-Z]+\\s\\w+\\sis");
Matcher m1 = p.matcher(m);
if(m1.find()){
String group []= m1.group().split("\\s");// split by space
System.out.println(group[1]);// print the 2 position
}