【问题标题】:How to regexp a comma separated list of predefined words?如何正则表达式逗号分隔的预定义单词列表?
【发布时间】:2015-12-23 10:01:34
【问题描述】:

编辑:

现在,答案就在这里:https://stackoverflow.com/a/23621738/551357

作为纲要,这是我第一次尝试以编程方式构建正则表达式时使用的一些原始代码的摘录,它有效:

$product_category_slugs_str = 'cat1|cat2|cat3|cat4'; //fake product category names
$product_category_slugs_count = count(explode('|',$product_category_slugs_str));
$rule = "($product_category_slugs_str)";

$current_lookahead = '';
$increment = 2;

for($i=0; $i<$product_category_slugs_count; $i++){
  //will produce consecutive negative lookaheads like (?!\1)(?!\3)(?!\5)
  $current_lookahead .= '(?!\\' . (1+$i*$increment) . ')';
  //zero or one word checked by negative lookahead and preceded by a comma
  $rule .= "(,$current_lookahead($product_category_slugs_str))?";
}

$rule .= '\/?$';//since it's for a url, adds an ending slash 

我必须匹配一个字符串,该字符串包含从预定义列表中挑选的任意数量的逗号分隔词。所以,如果列表是:

  • word1
  • word2
  • word3

正则表达式应该匹配如下字符串:

  • 'word1'
  • 'word1,word3'
  • 'word3'
  • 'word3,word1,word2'

等,但不是 'word3,word1,a_word_not_in_whitelist'

我真的不知道如何.. 顺便说一句,单词的白名单是一个数组,所以如果需要,我最终可以通过编程方式构建正则表达式。

可能是这样的

(word1|word2|word3) 后跟零个或多个“,(word1|word2|word3)”

有什么想法吗?

【问题讨论】:

    标签: regex


    【解决方案1】:

    您在问题中写的内容是这样的

    (word1|word2|word3)(,(word1|word2|word3))*
    

    【讨论】:

    • 是的,我只是在尝试,它有效。这条规则唯一可能的问题是它会让 word1、word1 之类的东西出现。在我的特定用例中不是一个真正的问题,但可以肯定的是,如果我能避免的话会更好。我该怎么办?
    • 我在这里发现了一种使用负前瞻的模式,虽然不是很优雅,但也许是唯一可能的模式? stackoverflow.com/questions/23621719/…
    • 如果那不是例子,是真实的话,那么(word[123])
    • @Stratboy,适用于文字,但正则表达式不适用于这种逻辑。据我所知,您不能将其与反向引用一起使用。
    • 也许只是为count(word) &lt;= 1添加另一个非正则表达式检查
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多