停止正则表达式跨行匹配

时间:2013-09-17 14:28:54

标签: java regex

我有一个正则表达式,

end\\s+[a-zA-Z]{1}[a-zA-Z_0-9]

应该匹配具有规范的行

end abcdef123

其中abcdef123必须以字母和后续字母数字字符开头。

但目前它也匹配此

foobar barfooend
bar fred bob

它在end结尾处barfooend,并且有效地barend bar作为合法结果返回。

我试过

^end\\s+[a-zA-Z]{1}[a-zA-Z_0-9]

但这似乎根本不起作用。它最终没有匹配。 它应该相当简单,但我似乎无法解决它。

3 个答案:

答案 0 :(得分:5)

\s还包含换行符。因此,您需要指定一个只包含想要的空白字符的字符类,或者排除不需要的字符类。

使用其中一个代替\\s+

答案 1 :(得分:3)

您可以使用\b(字边界检测)来检查字边界。在我们的例子中,我们将使用它来匹配单词end的开头。它也可以用来匹配单词的结尾。

正如@nhahtdh在评论中所说,{1}是多余的,因为[a-zA-Z]已经匹配给定范围内的一个字母。

此外,你的正则表达式不能做你想要的,因为它只匹配第一个字母后面的一个字母数字字符。最后添加+(一次或多次)或*(零次或多次)。

这应该有效:

"\\bend\\s+[a-zA-Z]{1}[a-zA-Z_0-9]*"

修改:我认为\b优于^,因为后者只匹配一行的开头。

例如,请输入以下内容:“end azd123 end bfg456”当^有助于匹配两者时,\b只会有一个匹配。

答案 2 :(得分:0)

尝试使用正则表达式:

end[ ]+[a-zA-Z]\w+

\w是一个单词字符:[a-zA-Z_0-9]