为什么这个贪婪的正则表达式不能按预期工作?

时间:2012-04-11 14:07:25

标签: php regex

我正在尝试学习一些正则表达式,有人能解释一下这里发生了什么吗?并举例说明可以提供预期输出的正则表达式?谢谢!

input data = 'Sometext|even more text'

regex = '(.*)?\|?.*'

replacement = '$1'

expected output = 'Sometext'

actual output = 'Sometext|even more text'

PHP

preg_filter("(.*)?\|?.*", "$1", 'Sometext|even more text'); // returns  Sometext|even more text

4 个答案:

答案 0 :(得分:1)

(.*)贪婪,所以匹配一切。 $1就是一切。

您可能正在寻找:

/^([^|]*).*$/

答案 1 :(得分:1)

你的正则表达式是“所有字符,然后是可选的|,后跟0或更多字符”。

将初始(.*)更改为([^\|]*),或将|设为非可选。

答案 2 :(得分:1)

*贪婪,这意味着它会尝试匹配尽可能多的文本。在这种情况下:

  • (.*)?将匹配所有文字
  • \|?.*将匹配“rest”(空字符串)

尝试:regex = '\|[^|]*', replacement = ''

答案 3 :(得分:1)

如果您将正则表达式更改为(\w+)?\|?.*,特别是在+之后添加\w,那么您将得到'Sometext'的预期答案。

您进行整个字符串匹配的原因是第一个.*与整个字符串匹配。通过上面的更改,您将匹配任何单词字符。