Java 如何检查字符是否为非单词边界

Java 如何检查字符是否为非单词边界,java,regex,Java,Regex,在Java正则表达式中,它有“\B”作为非单词边界 如果我有一个“char”,我如何检查它是否为非单词边界 谢谢。边界有一个特殊的含义。它实际上具有零长度匹配,因此不能在单个字符上匹配。它用于确定非单词字符和单词字符之间的位置。另见 然而,我理解这个问题更多的是给定的字符是否可能表示单词边界的开始或结束。从您链接的javadoc(是最新版本): 预定义的字符类 任何字符(可能匹配也可能不匹配行终止符) \d一个数字:[0-9] \D非数字:[^0-9] \s空白字符:[\t\n\x0B\f\r

在Java正则表达式中,它有“\B”作为非单词边界

如果我有一个“char”,我如何检查它是否为非单词边界


谢谢。

边界有一个特殊的含义。它实际上具有零长度匹配,因此不能在单个字符上匹配。它用于确定非单词字符和单词字符之间的位置。另见

然而,我理解这个问题更多的是给定的字符是否可能表示单词边界的开始或结束。从您链接的javadoc(是最新版本):

预定义的字符类

任何字符(可能匹配也可能不匹配行终止符)
\d
一个数字:
[0-9]

\D
非数字:
[^0-9]

\s
空白字符:
[\t\n\x0B\f\r]

\S
非空白字符:
[^\S]

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

\W
非单词字符:
[^\W]

因此,单词字符与
\w
匹配。非单词字符与
\W
匹配。因此:

String string = String.valueOf(yourChar);
boolean nonWordCharacter = string.matches("\\W");
((c>='a'&&c='a'&&c='a'&&c='a'&&c='0'&&c边界是两个字符之间的位置,因此一个字符永远不能是边界

如果您想匹配一个不被单词边界包围的字符,例如
abc
中的
b
,则可以使用

\B.\B
记住在Java字符串中转义反斜杠,如

Pattern regex = Pattern.compile("\\B.\\B");

这个问题很奇怪,但是一个
\w
本身被
\b
包围,这是事实。同样地,一个
\w
本身被
\b
包围。因此,就单词边界定义而言,
^
$
是非单词字符

    System.out.println("a".matches("^\\b\\w\\b$")); // true
    System.out.println("a".matches("^\\b\\w\\B$")); // false
    System.out.println("a".matches("^\\B\\w\\b$")); // false
    System.out.println("a".matches("^\\B\\w\\B$")); // false

    System.out.println("@".matches("^\\b\\W\\b$")); // false
    System.out.println("@".matches("^\\b\\W\\B$")); // false
    System.out.println("@".matches("^\\B\\W\\b$")); // false
    System.out.println("@".matches("^\\B\\W\\B$")); // true

    System.out.println("".matches("$$$$\\B\\B\\B\\B^^^")); // true
最后一行可能令人惊讶,但这就是锚的本质

另见

查看关于
\b
边界到底是什么的讨论,以及如何使您的正则表达式以您可能希望的方式运行。

注意:这并不能告诉您它是否是边界,只是它是一个非单词字符。边界的概念与有序集合相关,不能合理地应用于单个集合le char。进一步澄清,边界是一个上下文特定的术语,仅检查一个char将删除用于
“\B”的上下文
regex。事实上,边界有一个特殊的含义。它实际上有一个零长度匹配。还可以看到,这实际上是用来确定非单词字符和单词字符之间的位置。但是,我理解他的问题更多的是给定字符是否可能表示单词边界的开始或结束。我将最后的注释添加到您的原始问题旨在强调一个事实,即
\b
\b
不匹配字符,而是匹配位置,因为这正是michael所困惑的。所讨论的“边界”是一个锚定:字符之间(或之前/之后)的位置,而不是字符本身(类似于
^
不是指字符,而是指第一个字符之前的位置).所以这个问题本身有点没有意义,你可能需要澄清一下,这样我们才能确切地知道你想要什么。在实践中,可以将边界定义为只存在于两个字符之间的东西。但是,它实际上比这更自由,至少在Java中是这样。请看我的答案。你说的不是真的:所有这些东西在Java中都被打破了。如果你编译了一个像
\b\w+\b
这样的模式,并对字符串
élève
使用Matcher#find方法,你将找不到任何匹配项。Java正则表达式非常糟糕。请查看原因,以及你能做些什么。非常棒的解释,谢谢-这确实让它的工作原理更加清晰。
Pattern regex = Pattern.compile("\\B.\\B");
    System.out.println("a".matches("^\\b\\w\\b$")); // true
    System.out.println("a".matches("^\\b\\w\\B$")); // false
    System.out.println("a".matches("^\\B\\w\\b$")); // false
    System.out.println("a".matches("^\\B\\w\\B$")); // false

    System.out.println("@".matches("^\\b\\W\\b$")); // false
    System.out.println("@".matches("^\\b\\W\\B$")); // false
    System.out.println("@".matches("^\\B\\W\\b$")); // false
    System.out.println("@".matches("^\\B\\W\\B$")); // true

    System.out.println("".matches("$$$$\\B\\B\\B\\B^^^")); // true