【问题标题】:Match a substring, ignoring a list of words and special characters匹配子字符串,忽略单词列表和特殊字符
【发布时间】:2021-11-05 08:00:04
【问题描述】:

我有 1 个或多个单词的短语需要与某些文本进行匹配。特殊字符必须被忽略,还有一小部分单词 (~20) 也应该被忽略。

例子:

短语-“猫鱼”;

忽略单词 - “喜欢”

  • “有一条鲶鱼。” - 正确

  • “有一只猫、鱼和一条狗。” - True(标点符号“,”被忽略)

  • “我的非常喜欢。” - True(特殊字被忽略)

  • “我的喜欢)-鱼非常喜欢。” - True(忽略标点符号和特殊词)

  • “我的猫很喜欢吃鱼。” - 错误

我有一个“特殊”词列表,这些词是可选的,应该被忽略(例如,“喜欢”)

我尝试了正则表达式,但似乎无法处理特殊字符

\b(cat)(\s|likes)(fish)\b

【问题讨论】:

  • this 为您工作吗?
  • "cat fish"是否需要至少用1个空格隔开?
  • @NielGodfreyPonciano 是的,必须有一个空格。谢谢你的快速回答:)

标签: regex


【解决方案1】:

我们可以通过否定形式[^\w]轻松捕获特殊字符。试试这个:

\bcat\b[^\w]*(?:likes)?[^\w]*\bfish\b

或者,如果您想匹配任意数量的单词"likes",例如"My cat likeslikeslikes -+)) likes fish very much.":

\bcat\b(?:[^\w]|likes)*\bfish\b

或者如果您想匹配任意数量的单词"likes",但必须用空格或特殊字符分隔,例如"My cat likes likes-likes -+)) likes fish very much.":

\bcat\b(?:[^\w]|\blikes\b)*\bfish\b

示例运行

地点:

  • \bcat\b - 匹配被单词边界包围的“猫”
  • (?:[^\w]|\blikes\b)* - 可选匹配:
    • 任何特殊字符
    • “喜欢”一词被单词边界包围
  • \bfish\b - 匹配被单词边界包围的“鱼”

【讨论】:

  • 啊,我明白了。感谢您指出:) 我更新了答案。
  • 我选择了第二个建议( \bcat(?:[^\w]|likes)*fish\b ),但是如果还有更多,我该如何修改它以要求“空格”超过 1 个“赞”?
  • @MiroslavGeorgiev 您可以添加单词边界 \b 来要求空格。我更新了我的答案,你能检查一下它是否对你有用吗?
  • 是的,它有效!我其实稍微修改了一下,因为下划线("_")有问题。我还添加了几个“忽略”字眼。 (\b|_)cat(\b|_)(?:[^a-zA-Z0-9]|(\b|_)wants(\b|_)|(\b|_)likes(\b|_)|(\b|_)eats(\b|_))*(\b|_)fish(\b|_)你认为这是忽略"_"的好方法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多