正则表达式可以用于不同的语言吗?

11

当然,英语对于正则表达式来说是易如反掌的,因为它最初就是在/针对它开发的:

正则表达式能理解这个字符集吗?

法语涉及一些带重音的字符,我不确定如何匹配 - 即 è 和 e 是否都被正则表达式视为单词字符?

Les expressions régulières peuvent-elles comprendre ce jeu de caractères?

日语中没有我所知道的正则表达式单词字符可供匹配。

正規表現はこの文字集合を理解できますか?


我认为这可能也严重取决于正则表达式引擎运行的平台,你有想到某个平台吗? - Lazarus
"正则表达式",或称“Regex”,是一个涵盖了你可能想要称之为字母表的符号集合的概念。在实践中,有许多不同的正则表达式引擎(所有我看过的都添加了其他功能),其中某些引擎可能很好地处理Unicode,而另一些可能不会。简而言之,这是一个与平台相关的问题,为了获得有用的响应,您需要告诉我们您所谈论的正则表达式引擎是哪一个。 - David Thornley
8个回答

9

简短回答: 是的

更具体地说,它取决于您的正则表达式引擎是否支持Unicode匹配(如此处所述)。

这样的匹配可以使您的正则表达式变得非常复杂,因此我建议阅读这篇 Unicode正则表达式教程(还要注意,Unicode实现本身可能会非常混乱,因此您可能还会从Joel Spolsky的文章中了解字符集的内部工作原理)。


2
请注意,Unicode 并不是混乱的根源。而是之前所有尝试使整个问题变得混乱不堪。 - Joachim Sauer
1
根据那篇文章的定义,Unicode 本身不会混乱:实现可能会出问题。 - Tom
问题在于\p{L}和所有以/p{ }开头的都是针对PCRE的。那我们来谈谈PCRE吧。 - undefined

4

"[\p{L}]" 这个正则表达式包含了所有语言的大小写字母,例如(a-z A-Z ä ß è 正 の文字を理解)等字符可以接受,然而类似(, . ? > :)或其他符号无法匹配。

  • 方括号[]表示这个表达式是一个集合。
  • 如果你想要匹配无限数量的该集合中的字母,可以在方括号后面加上星号*,像这样: "[\p{L}]*"。
  • 在正则表达式中有时需要注意空格,因为空格可能会导致匹配失败。要解决这个问题,可以用"[ \p {L}]*"(注意方括号中的空格)。
  • 如果你想把数字也加进去,可以使用“[\p{L|N} ]*”。其中 p{N} 匹配任何脚本中的任何数字字符。

我也发现这对不同语言非常有帮助:https://medium.com/@h2s1880/how-to-use-regular-expressions-to-distinguish-national-languages-in-swift-c19d6d8d0a97 - div-ane
然而,$ % & * ¥ √ 是被接受的,但不应该被接受。有时候 ß 也不被接受,为什么呢?在线的正则表达式工具,比如“regexr.com”(被认为是最好的)也存在很多问题。你们的编码是应用于PCRE引擎,对吗?我看到它并不是100%有效的。它接受了一些字符,拒绝了其他应该被接受的字符。是否有PHP函数可以检测一个字符是否真正属于现有的字母表,而不是数学符号或类似的东西? - undefined

1
据我所知,没有任何特定的模式可以使用,例如[a-zA-Z]来匹配“è”,但您总是可以单独匹配它们,例如[a-zA-Zè正]。
显然,这可能会使您的正则表达式变得非常庞大,但您可以通过将字符串添加到变量中,并仅将变量传递到表达式中来控制此过程。

1

一般来说,正则表达式更适用于理解机器可读性文本而非人类可读性文本。在许多方面上,它是对整个XML与正则表达式的更普遍的答案;正则表达式本质上无法正确地解析人类语言,因为语言比您用来解析它的工具更加复杂。

如果您想要分解人类语言(包括英语),您需要使用语言分析工具甚至是人工智能,而不仅仅是普通的正则表达式。


1

/[\p{Latin}]/ 应该包括拉丁字母。您可以在这里获得完整的解释和参考资料。


1
那是一个看起来很有用的网站,但它只关注Perl和类似的正则表达式引擎。它并不是普适的。 - David Thornley
嗯,我不确定提问者使用的是哪个引擎,但也许这对他有用?Perl正则表达式引擎被广泛使用。 - casraf

0

这不是关于正则表达式本身,而是关于执行它的框架。我认为Java和.NET在处理Unicode方面非常出色。因此,“è和e都被正则表达式视为单词字符”是正确的。


0

这取决于实现和字符集。一般来说,答案是“是”,但可能需要您进行额外的设置。

例如,在Perl中,像\w这样的东西的含义会受所选择的语言环境(使用locale)的影响。


0

在哪个引擎中使用正则表达式?Perl?Boost?Java? - David Thornley
6.2升V8。还有什么其他种类呢? - Tom

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