我试图使用正则表达式来匹配空格分隔的数字。 我找不到\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

当前回答

我在这里讨论了b风格正则表达式的边界。

简而言之,它们是有条件的。它们的行为取决于它们旁边的东西。

# same as using a \b before:
(?(?=\w) (?<!\w)  | (?<!\W) )

# same as using a \b after:
(?(?<=\w) (?!\w)  | (?!\W)  )

有时候这并不是你想要的。详见我的另一个答案。

其他回答

单词边界可以出现在以下三个位置之一:

如果第一个字符是单词字符,则在字符串的第一个字符之前。 如果最后一个字符是单词字符,则在字符串的最后一个字符之后。 在字符串中的两个字符之间,其中一个是单词字符,另一个不是单词字符。

单词字符是字母-数字;负号不是。 摘自正则表达式教程。

查看关于边界条件的文档:

http://java.sun.com/docs/books/tutorial/essential/regex/bounds.html

看看这个例子:

public static void main(final String[] args)
    {
        String x = "I found the value -12 in my string.";
        System.err.println(Arrays.toString(x.split("\\b-?\\d+\\b")));
    }

当你把它打印出来时,注意输出是这样的:

[我发现值-,在我的字符串。]

这意味着“-”字符不会因为位于单词的边界而被拾取,因为它不被认为是单词字符。看来@brianary比我先下手为强,所以他得到了支持。

在大多数正则表达式方言中,单词边界是在\w和\w(非单词字符)之间的位置,或者在字符串的开头或结尾(分别)以单词字符([0-9A-Za-z_])开始或结束的位置。

因此,在字符串“-12”中,它将匹配在1之前或2之后。破折号不是文字字符。

我相信你的问题是由于一个事实-不是一个字字符。因此,单词boundary将在-之后匹配,因此不会捕获它。单词边界匹配字符串中第一个单词字符之前和最后一个单词字符之后,以及在它之前是单词字符或非单词字符,在它之后是相反的任何位置。还要注意,单词边界是零宽度匹配。

一个可能的选择是

(?:(?:^|\s)-?)\d+\b

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

单词边界是一个位置,它的前面有一个单词字符而后面没有一个,或者后面有一个单词字符而前面没有一个。