【问题标题】:word boundary that rejects leading/end non-alphanumeric character拒绝前导/结束非字母数字字符的单词边界
【发布时间】:2013-03-10 07:50:27
【问题描述】:

现在我正在学习 Java 的正则表达式,但我对单词边界有疑问。因此,当我在 Java 正则表达式上查找单词边界时,我得到了这个 \b 接受以非单词字符为边界的单词,所以这个正则表达式 \b123\b 将接受此字符串123 456,但将拒绝456123456。现在我发现像!$@#@%123^^%$#"123" 这样的条件仍然被上面的正则表达式接受。是否有任何单词边界/模式拒绝像上面的示例那样以非字母数字(空格除外)为边界的单词?

【问题讨论】:

  • 你希望123在什么条件下被接受? 123 456 中的 123 也以非字母数字为边界。
  • 编辑:我的意思是用空格隔开,所以456 123 456 仍然被接受,但654123789 会被拒绝,尽管它包含 123

标签: java regex alphanumeric word-boundary


【解决方案1】:

您想使用\s 而不是\b。这将寻找一个空白字符而不是一个单词边界。

但是,如果您希望123 456 的第一个示例匹配,那么您还需要使用锚点在字符串的开头或结尾处接受123。这可以通过(\s|^)123(\s|$) 完成。克拉^ 匹配字符串的开头,$ 匹配字符串的结尾。

【讨论】:

  • 我试过了,但在上面的相同测试用例中它根本没有返回任何结果
  • “完全没有结果”是什么意思?您调用的实际代码是什么?
  • 表达式已修复。使用字符类是不正确的。字符类使匹配器查找字符 ^ 和 $ 而不是所需的锚。
【解决方案2】:
(?<!\S)123(?!\S)

(?&lt;!\S) 匹配前面 没有非空白字符的位置。 (消极的后视)

(?!\S) 匹配一个没有后跟非空白字符的位置。 (负前瞻)

我知道这看起来很复杂,但那是因为\b 隐藏了很多复杂性。相当于这样:

(?<=\w)(?!\w)|(?=\w)(?<!\w)

...表示前面有一个单词字符而不是后面一个字符的位置,或者是一个后面一个单词的位置字符而不是前面一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多