![]() |
1
2
这可以用现代的regex来完成,因为存在大量对regex引擎的黑客攻击,但是让我做一个发布“不要用正则表达式做这件事”答案的人。 这是 不 正则表达式的作业。这是一个全面的解析器的工作。作为一个不能用(经典)正则表达式处理的示例,请考虑:
没有(经典的)regex可以确定这些括号是否正确匹配,但是在没有regex的情况下这样做是很简单的:
看看编写一些非regex代码为您完成这项工作有多简单? 编辑:好的,看《冒险乐园》回来。:)试试这个(用Perl编写,注释后帮助你理解我在做什么,如果你不了解Perl的话):
另一种方法是:
(我给出两个答案是因为,在另一种语言中,一种解决方案可能比另一种更容易实现,而不仅仅是因为有多种方法可以做到这一点) 当然,当您的问题变得越来越复杂时,构建一个完整的解析器会带来一些好处,但这是另一匹马。现在,这就足够了。 |
![]() |
2
4
最简单的方法是同时匹配逗号和带引号的字符串,然后过滤掉带引号的字符串。
如果您真的不能匹配引号,可以这样做:
这可能会变慢,因为对于每个逗号,它必须查看剩余的字符并计算引号的数量。
如果您不介意额外的捕获组,可以这样做:
这将只扫描字符串一次。它从字符串的开头开始计算引号。
最后一个模式可能需要一个例子。
它匹配逗号前面的字符串以及逗号。 |
![]() |
3
1
如前所述, regexp cannot match any nested pattern ,因为它不是 Context-free language .
所以如果你有任何嵌套的引号,你不会用正则表达式来解决这个问题。
除非您添加了进一步的规范,例如必须转义引号中的引号。 在这种情况下,以下内容:
将成功匹配:
|
![]() |
4
0
这里有一个得到匹配的表达式,但它并不完美,因为它得到的第一个匹配是整个字符串,删除了最后一个”。
我一直在用我的 Free RegEx tester 看看有什么效果。 试验结果
|
![]() |
5
0
您最好构建一个简单的解析器(伪代码):
|
![]() |
6
0
这取决于是否允许嵌套引号。 理论上,使用嵌套引号是不能这样做的(常规语言不能计数) 在实践中,如果可以限制深度,则可以进行管理。当你增加复杂性的时候,它会变得越来越难看。这就是人们经常用正规的表达方式陷入悲伤的原因(尝试去匹配一些通常不正规的东西)。 请注意,一些“regex”库/语言添加了非常规功能。 如果这类事情变得足够复杂,您就必须为它编写/生成一个解析器。 |
![]() |
7
0
你需要更多的描述。您想要任何一组可能的带引号的字符串和非带引号的字符串吗? 洛伦伊普桑“多洛尔坐”阿美,“神圣的阿迪皮斯”精英。 …或者只是你想要的模式?我觉得这很接近…
但它确实捕获了“”。 |
![]() |
8
0
也许你可以分两步做?
然后从剩余的字符串中提取所需的内容 |
![]() |
9
0
正则表达式可能无法计数,但它们可以确定某个数是奇数还是偶数。查找逗号后,lookahead断言,如果前面有引号,则有偶数,这意味着逗号是 不 在一组引号中。 如果需要的话,可以调整它来处理转义引号,尽管最初的问题没有提到这一点。另外,如果您的regex风格支持它们,我会添加原子组或所有格量词来检查回溯。 |
![]() |
lonix · 使用sed从JSON中提取非贪婪正则表达式 1 年前 |
![]() |
Dima Malko · 如何在指定符号前添加符号? 2 年前 |
![]() |
shekharsabale · 从列表元素捕获子字符串 2 年前 |
![]() |
Katia · 根据特定规则进行多行匹配 2 年前 |
![]() |
MHA · Pandas str.extract()以字母结尾的数字 2 年前 |
![]() |
Slava Vir · 如何查找后面“/”之间的最后一组 2 年前 |