【问题标题】:Retrieve strings delimited by comma ignoring leading and trailing spaces检索由逗号分隔的字符串,忽略前导和尾随空格
【发布时间】:2016-06-05 04:19:21
【问题描述】:

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

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

示例 1: 测试字符串是:

' Monday,Tuesday, Wednesday ,Hello World , Lorem ipsum dolor sit amet , , a b c d e '
预期结果是检索到的字符串:
'星期一'
'周二'
'周三'
'你好世界'
'Lorem ipsum dolor sit amet'
'a b c d e'

示例 2: 测试字符串是:

'星期一,星期二'

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

'星期一'
'星期二'

我试图通过像这样使用积极的前瞻和积极的后视来实现它

(?

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

谢谢

【问题讨论】:

  • 最好使用trimexplode 而不是regex 它会产生开销

标签: php regex preg-match-all


【解决方案1】:

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

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

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

regex demo

细分:

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

【讨论】:

  • 这是针对当前需求的通用解决方案。
  • 感谢@Wiktor Stribiżew 提供启发性和启发性的解决方案。你的答案和 karthik manchala 的答案都对我有用。事实上,我不需要带有特殊字符的字符串的结果,但没有告诉这一点。
【解决方案2】:

您可以使用以下内容:

(\b[^,]+\b)

RegEX DEMO

免责声明:这适用于您的字符串不以任何特殊字符开头/结尾的情况。

【讨论】:

  • 如果一个值不是以单词字符开头(如<Monday>,+Tuesday,...),this (\b[^,]+\b) will not work as expected
  • 是的..我有这个想法..但是如果没有这样的字符串..这是最简单的..同样,这取决于OP想要什么:)
  • 这更像是一种黑客解决方案,仅适用于特定输入。请添加免责声明。
  • @WiktorStribiżew 添加:)
  • 感谢@karthik manchala 的聪明解决方案。我可能会用你的。我需要它来对路由器中的字符串进行反序列化。类似于 MVC 设计模式路由器。所以我将按照你的猜测在字符串中使用典型世界。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-23
  • 2021-07-09
  • 2019-03-28
  • 1970-01-01
  • 1970-01-01
  • 2018-09-26
  • 2010-12-17
相关资源
最近更新 更多