我有一个语句,它找到包含一个字符的字符串,比如说P.当匹配一个没有空格分隔的字符串时,它会起作用
e.g。
APAXA
正则表达式为^[^P]*P[^P]*$
它选择了这个字符串,但是,如果我有一个字符串
怎么办XPA DREP EDS
正则表达式可以识别一行中与条件匹配的所有字符串(字符串总是被某种白色空格分隔 - 制表符,空格等)?
e.g。我如何突出XPA和DREP
我使用while(m.find())
多次循环和System.out.println(m.group())
所以m.group必须包含整个字符串。
答案 0 :(得分:2)
按空格拆分,然后根据现有正则表达式检查每个标记。
答案 1 :(得分:1)
为什么它必须是一个过于复杂的正则表达式?
String string = "XPA DREP EDS";
String[] s = string.split("\\s+");
for( String str: s){
if ( str.contains("P") ){
System.out.println( str );
}
}
答案 2 :(得分:0)
您可以尝试使用\s
模式(匹配空格)。请查看java的这个regexp页面。
答案 3 :(得分:0)
\b[^P\s]*P[^P\s]*\b
将匹配包含恰好一个P的所有单词。在从Java字符串构造正则表达式时,不要忘记加倍反斜杠。
<强>解释强>
\b # Assert position at start/end of a word
[^P\s]* # Match any number of characters except P and whitespace
P # Match a P
[^P\s]* # Match any number of characters except P and whitespace
\b # Assert position at start/end of a word
请注意,在处理Unicode字符串时\b
与所有字边界不匹配(感谢tchrist提醒我)。如果是这种情况,您可能希望将\b
替换为(不要看):
(?:(?<=[\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]])(?![\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]])|(?<![\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]])(?=[\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]]))
(摘自this question's获奖答案)
答案 4 :(得分:0)
Thr reex是^ [^ P] P [^ P] $
这样的正则表达式只找到包含一个P的字符串,这可能是也可能不是你想要的。我想你想要.*P.*
。
要查找包含至少一个 P的所有单词,您可以使用\\S+P\\S+
,其中\S
代表非空白字符。您可以考虑使用\w
。
要查找包含恰好一个 P的所有单词,您可以使用更复杂的[^\\sP]+P[^\\sP]+(?=\\s)
。在这里,\s
代表空白,[^abc]
匹配abc的所有预期,(?=...)
是预见。没有前瞻,你会在“APBPC”中找到两个“单词”:“APB”和“PC”。
答案 5 :(得分:0)
尝试在您的否定字符类中添加空格字符(\s
),并且还要删除^
和$
锚点:
[^P\s]*P[^P\s]*
或作为Java String文字:
"[^P\\s]*P[^P\\s]*"
请注意,上面的不对Unicode有效,只有ASCII(如评论中提到的tchrist)。