【问题标题】:Regex not finding two letter words that include Swedish letters正则表达式未找到包含瑞典字母的两个字母单词
【发布时间】:2021-08-10 16:10:12
【问题描述】:

所以我对正则表达式非常陌生,我设法创建了一种方法来检查字符串中是否存在特定单词,而不仅仅是另一个单词的一部分。

示例: 我正在寻找“香蕉”这个词。 香蕉 == 真,香蕉拉玛 == 假

这一切都很好,但是当我在查找包含瑞典字母(Å、Ä、Ö)且仅包含两个字母的单词时出现问题。

示例: 我在一个看起来像这样的字符串中寻找单词“på”:“på påsk” 它以负面的形式返回。 但是,如果我寻找“påsk”这个词,那么它就会返回正面。 这是我正在使用的正则表达式:

const doesWordExist = (s, word) => new RegExp('\\b' + word + '\\b', 'i').test(s);
stringOfWords = "Färg på plagg";
console.log(doesWordExist(stringOfWords, "på"))
//Expected result: true
//Actual result: false

但是,如果我将单词“på”更改为三个字母的单词,那么它就会返回 true:

const doesWordExist = (s, word) => new RegExp('\\b' + word + '\\b', 'i').test(s);
stringOfWords = "Färg pås plagg";
console.log(doesWordExist(stringOfWords, "pås"))
//Expected result: true
//Actual result: true

我一直在寻找答案,我发现了一些与瑞典字母有类似问题的问题,他们都没有真正只寻找整个单词。 谁能解释我做错了什么?

【问题讨论】:

  • 您确定您的用例需要 RegEx 吗?如果你在一个句子中寻找一个完整的单词,RegEx 可能是矫枉过正。 RegEx 在您需要匹配更复杂的模式的情况下表现出色。
  • 好吧,在我检查了单词是否存在后,我使用正则表达式来找出单词的位置,以便我可以根据需要编辑单词。而且我不知道没有正则表达式是否有一种简单的方法来做到这一点

标签: javascript regex symbols


【解决方案1】:

word boundary\b 严格依赖于\w 匹配的字符,short-hand character class 对应[A-Za-z0-9_]

为了获得类似的行为,您必须重新实现其功能,例如:

const swedishCharClass = '[a-zäöå]';
const doesWordExist = (s, word) => new RegExp(
    '(?<!' + swedishCharClass + ')' + word + '(?!' + swedishCharClass + ')', 'i'
).test(s);

console.log(doesWordExist("Färg på plagg",  "på"));  // true
console.log(doesWordExist("Färg pås plagg", "pås")); // true
console.log(doesWordExist("Färg pås plagg", "på"));  // false

对于更复杂的字母,我建议你看看Concrete Javascript Regex for Accented Characters (Diacritics)

【讨论】:

  • 非常感谢!! :D 我刚刚完成了前端开发的学业,但到目前为止我还没有使用过多的正则表达式。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-23
  • 2015-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多