正则表达式中的单词边界是什么?

217

我试图使用正则表达式来匹配空格分隔的数字。 我找不到\b(“单词边界”)的准确定义。 我曾认为-12将是一个“整数单词”(可由\b\-?\d+\b匹配),但似乎这不起作用。 我很感激了解任何方法。

[我在Java 1.6中使用Java正则表达式]

示例:

Pattern pattern = Pattern.compile("\\s*\\b\\-?\\d+\\s*");
String plus = " 12 ";
System.out.println(""+pattern.matcher(plus).matches());

String minus = " -12 ";
System.out.println(""+pattern.matcher(minus).matches());

pattern = Pattern.compile("\\s*\\-?\\d+\\s*");
System.out.println(""+pattern.matcher(minus).matches());

这将返回:

true
false
true

你能否提供一个带有输入和期望输出的小例子? - Brent Writes Code
示例: Pattern pattern = Pattern.compile("\s\b\-?\d+\s"); String plus = " 12 "; System.out.println(""+pattern.matcher(plus).matches()); String minus = " -12 "; System.out.println(""+pattern.matcher(minus).matches()); pattern = Pattern.compile("\s\-?\d+\s"); System.out.println(""+pattern.matcher(minus).matches()); 结果为: true false true - peter.murray.rust
13个回答

1
我相信你的问题是由于 - 不是一个单词字符造成的。因此,单词边界将在 - 之后匹配,因此不会捕获它。单词边界与字符串中第一个和最后一个单词字符之前以及在其之前是单词字符或非单词字符,之后是相反的任何地方匹配。还要注意,单词边界是零宽度匹配。
一个可能的替代方案是
(?:(?:^|\s)-?)\d+\b

这将匹配以空格字符和可选破折号开头,以单词边界结尾的任何数字。它还将匹配从字符串开头开始的数字。


0

当您使用\\b(\\w+)+\\b时,这意味着精确匹配只包含单词字符([a-zA-Z0-9])的单词。

例如,在您的情况下,将\\b设置为正则表达式的开头将接受带有空格的-12,但它不会接受没有空格的-12

为了支持我的说法,请参考:https://docs.oracle.com/javase/tutorial/essential/regex/bounds.html


-1
我认为它是最后一个匹配项的边界(即后面的字符)或字符串的开头或结尾。

2
你可能会想到\G:在第一次匹配尝试时,它匹配字符串的开头(就像\A);之后它匹配上一个匹配结束的位置。 - Alan Moore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接