如何正则表达逗号分隔的预定义单词列表?

时间:2015-12-23 10:01:35

标签: regex

编辑:

目前,答案就在这里: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)”

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

你在问题​​中写的内容是这样的

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