汉字和日语字符匹配的正则表达式单词

时间:2018-07-04 03:42:35

标签: javascript regex

我知道检测字符串是否为汉字的模式,但这不是我所需要的。我需要检查字符是否在字符串中找到。

const words_found = (words, values) => 
 words.some(word => 
   values.match(new RegExp(word + '\\b', 'i'))
)

words_found(['james'], 'my name is james') // true

但中文字符失败

words_found(['一个'], '你说到这是一个测试') // false

2 个答案:

答案 0 :(得分:1)

\b仅适用于单词和非单词之间的边界。如果是中文,则整个“你说到这是一个测试”都被视为一个单词,因此“一个”不会将“你说到这是一个测试”与带有\b的正则表达式匹配,因为“一个”不在“你说到这是一个测试”的单词边界上。另一方面,“测试”将匹配。对于中文单词,简单的子字符串匹配通常就足够了。

答案 1 :(得分:0)

阅读documentation for word boundaries

  

单词边界匹配单词字符后跟非单词字符之间的位置,或者匹配非单词字符后跟单词字符之间的位置。

其中“文字字符”是与\w匹配的东西(基本上是单字节字母数字和下划线),而“非文字字符”是与\W匹配的东西。

请注意,我们通常认为的所有汉字被视为“非单词字符”,与JavaScript正则表达式中单词边界的定义有关。换句话说,一和个之间没有单词边界,因为它们都是非单词字符。同样,一个和测试之间也没有单词边界,因为个和测都是非单词字符。

对于通常不使用空格的日语,中文和韩语,甚至没有一个单一的明确定义来定义“单词”的概念,因此也没有“单词字符”或“单词”的概念边界”。多年来,人们一直在研究涉及机器学习的库,这些库试图将文本分成有意义的类似单词的段,并且它们的使用方式都略有不同。这里的相关问题是为什么,您认为您想将中文分解为您认为的“单词”(或者找到出现在“单词边界”之前的字符串)。您的意思是什么? \\b迫使匹配发生在字词边界之前?您要排除哪种情况?

使用Unicode正则表达式属性

但是,您也许可以在ECMAScript 2018(http://2ality.com/2017/07/regexp-unicode-property-escapes.html)中使用新的Unicode regexp字符类转义符。例如,要匹配出现在看起来不像汉字(或任何字母)的东西之前的中文字符串,可以使用

new RegExp(`${word}(?=$|\P{Letter})`, "u")

粗略地讲,这可以翻译成“找到单词,但只有它后面是字符串结尾((?=)或aa字符(使用$部分)确实具有Unicode属性“ Letter”。"u"标志启用Unicode处理。

当然,这不会帮助您在您说到这是一个测试中找到一个“单词”,因为以下字符测距属于Unicode类“字母”,因此与{{1}不匹配}。

顺便说一下,要匹配Unicode中的任何“非单词”符号,您可以使用:

\p{Letter}
相关问题