【问题标题】:RegExp set contains one or multiple words正则表达式集包含一个或多个单词
【发布时间】:2021-12-21 22:21:52
【问题描述】:

在正则表达式中是否有一种方法可以将 子集 词与由分隔符分隔的 词进行匹配,而不涉及为每个新词创建新模式添加到集合中的单词。

现在除了为每个额外的 itemitem1, item2, ...}) 模式之外,我想不出别的办法/em> 在集合中(参见下面的示例)。

匹配集合中单个单词的示例:

Set: foo,bar,baz
Match: foo
RegExp:/^(foo|bar|baz)$/ <- MATCH

匹配子集字词的示例:

Set: foo,bar,baz
Match: foo,bar
RegExp: /^(foo|bar|baz)(?:,(foo|bar|baz)(?:,(foo|bar|baz))?)?$/ <- MATCH

当向集合中添加新项目时,模式会迅速增长。有一些(神奇的)方法可以在较短的版本中做到这一点吗?

【问题讨论】:

    标签: regex set subset


    【解决方案1】:

    一种看起来比您当前尝试稍好一点的通用方法是使用前瞻:

    ^(?=.*\bfoo\b)(?=.*\bbar\b).*$
    

    Demo

    您可以为每个需要在输入 CSV 列表中匹配的 CSV 术语添加一个前瞻断言。

    编辑:如果您想在此处使用 OR 行为,那么我们可以使用交替的前瞻。要匹配 foobar 作为 CSV 术语,我们可以尝试:

    ^(?:(?=.*\bfoo\b)|(?=.*\bbar\b)).*$
    

    【讨论】:

    • 我也考虑过使用前瞻。您需要一个 OR 运算符来使其匹配一个或多个,同时还要考虑分隔符。此 RegExp 现在不匹配单个值,例如富。
    • 我假设你想要 AND 逻辑。是的,您可以使用替代 | 的前瞻 OR。
    • 该模式将类似于(但不包括匹配中的任何字符):^(?=.*\bfoo\b)|(?=.*\bbar\b)| (?=\b.*baz\b).*$.有什么想法吗?
    • 你有什么问题?
    • 对不起,让我改写一下;如果您同意我提供的模式等于您按照建议添加 OR 逻辑的想法。它现在匹配单个 'foo' 值,但匹配不包含任何字符。这仍有待解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    相关资源
    最近更新 更多