Javascript正则表达式匹配字符串与非混合unicode字符范围

时间:2017-06-22 13:55:56

标签: javascript regex unicode

我想在Javascript中对正则表达式提供一些帮助。

我正在尝试匹配任何只包含Basic Latin(ASCII)字符或仅包含希腊Unicode字符的字符串。不允许这两组中带有混合字符的字符串。

我有这个正则表达式匹配完全相反的(所有包含至少一个希腊语和一个拉丁字符的字符串),但找不到否定这个的方法:

https://regex101.com/r/JHzmhc/1

提前致谢。

2 个答案:

答案 0 :(得分:3)

您可以使用

^(?:[\u0000-\u007F]+|[\u0370-\u03FF]+)$

请参阅regex demo

<强>详情:

  • ^ - 字符串开头
  • (?: - 启动非捕获组(以便锚点可以应用于两个替换组):
    • [\u0000-\u007F]+ - 1+ ASCII字符
    • | - 或
    • [\u0370-\u03FF]+ - 1+希腊字符
  • ) - 小组结尾
  • $ - 字符串结束。

答案 1 :(得分:2)

Wiktor’s solution具有正确的通用格式。遗憾的是,匹配希腊符号并不像[\u0370-\u03FF]那么简单 - 这样就错过了很多希腊符号。

使用Unicode property escapes in regular expressions,您可以:

/^(?:[\0-\x7F\p]+|\p{Script_Extensions=Greek}+)$/u

在ECMAScript中正式支持Unicode属性转义并在任何地方实施之前,我们可以transpile将其转换为:

/^(?:[\0-\x7F]+|(?:[\u0342\u0345\u0370-\u0373\u0375-\u0377\u037A-\u037D\u037F\u0384\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03E1\u03F0-\u03FF\u1D26-\u1D2A\u1D5D-\u1D61\u1D66-\u1D6A\u1DBF-\u1DC1\u1F00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FC4\u1FC6-\u1FD3\u1FD6-\u1FDB\u1FDD-\u1FEF\u1FF2-\u1FF4\u1FF6-\u1FFE\u2126\uAB65]|\uD800[\uDD40-\uDD8E\uDDA0]|\uD834[\uDE00-\uDE45])+)$/

以下是演示:https://regex101.com/r/cmNTLA/1