检索由逗号分隔的字符串,忽略前导和尾随空格

时间:2016-02-23 10:59:13

标签: php regex preg-match-all

我尝试创建正则表达式模式以检索由逗号分隔的字符串,但也使用逗号前面或后面跟空格。 该项目的另一个要求是检索到的字符串不能有尾随和前导空格。

这必须与php preg_match_all函数一起使用。

示例1: 测试字符串是:

'    Monday,Tuesday, Wednesday ,Hello World ,   Lorem ipsum dolor sit amet  , ,  a b c d e   '
预期结果是检索到的字符串:

'Monday'
'Tuesday'
'Wednesday'
'Hello World'
'Lorem ipsum dolor sit amet'
'a b c d e'

示例2: 测试字符串是:

'Monday, Tuesday'

预期结果是检索到的字符串:

'Monday'
'Tuesday'

我试图通过使用像这样的正向前瞻和积极的外观来实现它

(?<=[\s,]).*?(?=[\s,])

但它不接受字符串中的空格并忽略测试字符串边缘的字符串,除非它们在结尾处有尾随空格或在测试字符串的开头处有前导空格。

谢谢

2 个答案:

答案 0 :(得分:2)

您可以使用以下内容:

(\b[^,]+\b)

请参阅RegEX DEMO

免责声明:如果您的字符串没有以任何特殊字符开头/结尾,则此方法有效。

答案 1 :(得分:2)

  

这必须与php preg_match_all函数一起使用。

如果您不想使用explode,可以使用相当复杂的正则表达式

'~(?:^|,)\s*\K(?=[^,]*[^\s,])[^,]+?(?=\s*(?:,|$))~'

请参阅regex demo

故障:

  • (?:^|,) - 匹配字符串的开头或,
  • \s* - 零个或多个空格
  • \K - 省略匹配值
  • 中当前匹配的符号
  • (?=[^,]*[^\s,]) - 要求该值不是仅在下一个,
  • 之前的空格
  • [^,]+? - 尽可能少地匹配,以外的一个或多个字符以容纳以下空格(如果有)
  • (?=\s*(?:,|$)) - 前瞻确保零个或多个空格后跟,或字符串结尾。