Javascript 中日字符的正则词匹配

Javascript 中日字符的正则词匹配,javascript,regex,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(['一个'], '你说到这是一个测试')

我知道检测字符串的模式是汉字,但这不是我需要的。我需要检查字符串中是否有字符

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

\b
仅适用于单词和非单词之间的边界。就中国人而言,整个你说到这是一个测试' 被认为是一个词,所以'一个' 不相配你说到这是一个测试' 使用带有
\b
的正则表达式模式一个' 不在'你说到这是一个测试'. '测试' 从另一方面来说,他们会匹配。对于中文单词,一个简单的子字符串匹配通常就足够了。

阅读下面的内容

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

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

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

对于一般不使用空格的日语、汉语和韩语,甚至没有一个明确的定义来定义“单词”的含义,因此没有“单词字符”或“单词边界”的概念。有一些图书馆,人们多年来一直致力于机器学习,试图将文本分割成有意义的类似单词的片段,但他们的做法略有不同。这里的相关问题是,为什么你认为你想把汉语分解成你认为的“单词”(或者找到出现在“单词边界”之前的字符串)。你的
\\b
迫使匹配出现在单词边界之前的意思是什么?你想排除什么情况

使用Unicode正则表达式属性 但是,您可能可以在ECMAScript 2018()中使用新的Unicode regexp字符类转义。例如,要匹配出现在看起来不像汉字(或任何字母)之前的中文字符串,您可以使用

new RegExp(`${word}(?=$|\P{Letter})`, "u")
粗略地说,这将转换为“查找单词,但只有它后面紧跟着字符串(
$
)或具有Unicode属性“Letter”的字符(
“u”
)的任何一端(使用“向前看”,即
部分)。
“u”
标志启用Unicode处理

当然,这无助于你找到一个 作为一个“字”在里面你说到这是一个测试, 因为下面的字符测 属于Unicode类“字母”,因此与
\p{Letter}
不匹配

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

[^\p{Alphabetic}\p{Mark}\p{Decimal_Number}\p{Connector_Punctuation}\p{Join_Control}]

总结:使用lookaheads/negative字符类构建自定义单词边界,或者如果您计划只支持ECMAScript 2018兼容的JS环境,请使用
new RegExp(word+'(?!\\p{L})',i')
(不确定您是否需要
i
,因为中文字母是无大小写的)。要匹配整个字母单词,请使用
new RegExp('(^\\p{五十} )(“+word+”)(?!\\p{L})“i”)