【发布时间】:2015-04-29 05:24:59
【问题描述】:
我是正则表达式的新手。有人可以帮助我在正则表达式中拆分以下数据。我尝试使用正则表达式\\\\,,但它在大括号内部和外部也以逗号分隔。大括号[] 内的逗号应该被跳过。
输入
[111,212],[231,543],[231,423]
输出
[111,212]
[231,543]
[231,423]
【问题讨论】:
我是正则表达式的新手。有人可以帮助我在正则表达式中拆分以下数据。我尝试使用正则表达式\\\\,,但它在大括号内部和外部也以逗号分隔。大括号[] 内的逗号应该被跳过。
输入
[111,212],[231,543],[231,423]
输出
[111,212]
[231,543]
[231,423]
【问题讨论】:
如果您确定逗号周围没有空格,则您想要的拆分正则表达式为,(?=\[)
JavaScript 中的示例:
$ node
> re = /,(?=\[)/
/,(?=\[)/
> "[111,212],[231,543],[231,423]".split(re)
[ '[111,212]', '[231,543]', '[231,423]' ]
Python 示例:
$ python
>>> import re
>>> r = re.compile(r',(?=\[)')
>>> re.split(r, "[111,212],[231,543],[231,423]")
['[111,212]', '[231,543]', '[231,423]']
解释:,(?=\[) 表示逗号后跟左括号。 (?=) 中的表达式是正向预测,不会被消耗。唯一用作分隔符的是逗号本身。但是我们分开的唯一逗号是左括号后面的逗号。我们不会以其他逗号分隔。
【讨论】:
在 Python 中(基于您留下的评论),匹配所有与splitting 字符串:
>>> import re
>>> s = '[111,212],[231,543],[231,423]'
>>> m = re.findall(r'\[[^]]*]', s)
>>> for x in m:
... print x
[111,212]
[231,543]
[231,423]
【讨论】:
您需要匹配后跟方括号或不跟数字的逗号。为此,您使用前瞻运算符。 ,(?=\[) 或 ,(?!\d) 都适合你。括号的内容不会成为匹配的一部分,只有逗号会。
【讨论】:
如果您知道没有空格,您可以使用,\B。\B 检查逗号是否位于非字母数字字符之前,例如[(与\b 相反)。
如果有空间,可以使用\s*,\s*+\B
(仅限 Perl,Python re 不支持 *+)。
\s*+ 是一个所有格量词,以确保所有空格都被占用。
工作示例:https://regex101.com/r/nJ2eK6/1
无论哪种方式,我都会选择 Hwnd 的答案 - 它允许您捕获两个数字,无论如何您可能都想要。
【讨论】: