我知道检测字符串是否为汉字的模式,但这不是我所需要的。我需要检查字符是否在字符串中找到。
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
答案 0 :(得分:1)
\b
仅适用于单词和非单词之间的边界。如果是中文,则整个“你说到这是一个测试”都被视为一个单词,因此“一个”不会将“你说到这是一个测试”与带有\b
的正则表达式匹配,因为“一个”不在“你说到这是一个测试”的单词边界上。另一方面,“测试”将匹配。对于中文单词,简单的子字符串匹配通常就足够了。
答案 1 :(得分:0)
阅读documentation for word boundaries。
单词边界匹配单词字符后跟非单词字符之间的位置,或者匹配非单词字符后跟单词字符之间的位置。
其中“文字字符”是与\w
匹配的东西(基本上是单字节字母数字和下划线),而“非文字字符”是与\W
匹配的东西。
请注意,我们通常认为的所有汉字被视为“非单词字符”,与JavaScript正则表达式中单词边界的定义有关。换句话说,一和个之间没有单词边界,因为它们都是非单词字符。同样,一个和测试之间也没有单词边界,因为个和测都是非单词字符。
对于通常不使用空格的日语,中文和韩语,甚至没有一个单一的明确定义来定义“单词”的概念,因此也没有“单词字符”或“单词”的概念边界”。多年来,人们一直在研究涉及机器学习的库,这些库试图将文本分成有意义的类似单词的段,并且它们的使用方式都略有不同。这里的相关问题是为什么,您认为您想将中文分解为您认为的“单词”(或者找到出现在“单词边界”之前的字符串)。您的意思是什么? \\b
迫使匹配发生在字词边界之前?您要排除哪种情况?
但是,您也许可以在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}