正则表达式匹配引号外的逗号 - XML 模式变体

Posted

技术标签:

【中文标题】正则表达式匹配引号外的逗号 - XML 模式变体【英文标题】:Regex Match Commas Outside Quotes - XML Schema Variant 【发布时间】:2018-01-17 20:34:57 【问题描述】:

乍一看,这似乎是一个常见问题:我想匹配逗号,但排除一对“双引号”之间的逗号。然而,让这个具有挑战性的是,我需要使用正则表达式的 XML Schema 风格 (W3C Specification)。

我能找到的所有解决方案都涉及前瞻,这不是这种正则表达式的特性。我得到的最接近的是:

(?:"[^"]*")|(,)

这可以避免匹配引号内的逗号,而是将引号以及其中的任何文本作为单独的组进行匹配。我遇到的一个建议是这样的:

(?:"[^"]*")(*SKIP)(*FAIL)|(,)

这可以完美运行,但同样,(*SKIP) 和 (*FAIL) 在此正则表达式变体中不可用。

Here is a sample.

Foo,Bar,"TEST, QUOTES",,Blah

这个测试字符串应该有 4 个匹配项 - 每个逗号,不包括引号中间的那个。它应该只匹配逗号,而不是它们之间的文本。

我很茫然,互联网。使用我可以使用的有限工具,这甚至可能吗?如果我不能让这个正则表达式工作,我唯一的其他选择会更混乱,可能更慢。

【问题讨论】:

您能给我们提供示例字符串及其预期输出吗? 你能在regex101.com上提供一个例子吗?它只是你需要匹配的逗号吗? 当你说你想“匹配逗号”时,你到底是什么意思?如果您使用的是 XSD 正则表达式,那么您可能正在验证字符串:这种类型的哪些字符串是有效的,哪些字符串是无效的? @MichaelKay 我正在使用仅支持 xml 样式正则表达式的文件格式定义工具。您可以使用正则表达式模式指定分隔符,因此通过匹配逗号,我可以像解析 CSV 时那样拆分字段。 【参考方案1】:

由于 XML 正则表达式的能力有限,您将无法解决这个问题,它是错误的工具。我建议使用 XML 解析器来根据需要处理内容。

XML regex 风格主要用于验证和 Unicode 属性...但不适用于像您这样的复杂任务。

XML Schema 正则表达式支持following:

字符类,包括速记、范围和否定类。 字符类减法。 点,匹配除换行符以外的任何字符。 交替和组。贪婪量词?*+n,m Unicode 属性和块

就是这样。

【讨论】:

感谢您的回答。我想可能是这样。我正在使用的软件应该让我定义文件格式,以便我可以对文件进行转换,所以正则表达式实际上是通过分隔符分割字段。 XML 是软件的支柱,所以即使我正在解析 CSV,它也需要 XML 样式的正则表达式。我想我只需要先编写一个单独的程序来操作文件,然后再将其放入程序中进行进一步操作。

以上是关于正则表达式匹配引号外的逗号 - XML 模式变体的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式匹配引号外的所有单词?

匹配引号之间的任何内容(逗号除外)

正则表达式匹配零和逗号

正则表达式删去双引号vscode

php 中文标点逗号‘,’怎么用正则匹配

除三个句点(省略号)外的字母周围句点的正则表达式