正则表达式匹配引号外的逗号 - 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 模式变体的主要内容,如果未能解决你的问题,请参考以下文章