【问题标题】:Unicode regex that do not match any letter nor any punctuation sign不匹配任何字母或任何标点符号的 Unicode 正则表达式
【发布时间】:2020-09-19 11:55:46
【问题描述】:

我正在尝试创建一个 unicode 正则表达式,它匹配除字母(任何语言)和标点符号 .;:?! 之外的每个字符。

例如字符串

abcd 123 kjd ¤%/(" .?:!

应该只匹配下面的粗体部分

abcd 123 kjd ¤%/(" .?:!

我知道\P{L}+ 匹配除字母之外的所有内容,\P{P}+ 匹配除标点符号之外的所有内容。如何将这两个正则表达式字符串合并为一个?我试过简单地将\P{L}+\P{P}+ 放在一起,但这并没有提供所需的匹配。我也试过写[^.;:?!]\P{L}+,但这也不起作用。

如何组合一个或多个 unicode 正则表达式,或者是否有更好的正则表达式可以满足我的要求?

【问题讨论】:

  • 可以在否定字符类[^ \p{L}.;:?!]regex101.com/r/7fVj9u/1中添加add \P{L}
  • @第四只鸟谢谢你,正是我想要的。如果您愿意,可以将其发布为答案,我会接受。
  • 其实结合\P{L}\P{P}这两个模式是[^\p{L}\p{P}]+,但它是does not seem to fetch your expected results。您只需要\p{P} 的一个子集,因此更容易使用自定义集。
  • @Thefourthbird 发布答案时,使用\p{Z}\s 代替常规空格可能会很方便。

标签: regex unicode


【解决方案1】:

使用\P{L}+\P{P}+ 将匹配任何字母的反义词的 1+ 倍,然后匹配任何标点符号的反义词的 1+ 倍。

模式[^.;:?!]\P{L}+ 匹配除所列字符之外的任何字符 1 次,然后匹配任何字母的相反字符 1+ 次。


您可以做的是将\p{L}(将匹配任何类型的字母)添加到否定字符类。根据Wiktor Stribiżew 的建议,您可以添加\p{Z} 来匹配任何类型的空格。

[^\p{Z}\p{L}.;:?!]

Regex demo

【讨论】:

    猜你喜欢
    • 2010-10-18
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    相关资源
    最近更新 更多