Java 正则表达式匹配由双引号引用的单引号
这是一个我一直在努力实现的正则表达式:Java 正则表达式匹配由双引号引用的单引号,java,regex,Java,Regex,这是一个我一直在努力实现的正则表达式: (?:"[^"]*"[^"]*)*?\"{1}([^"]*?([']{1,})[^"]*?)\" 这可能不是实现我想做的事情的最干净、最有效的方式,但我想我已经差不多做到了 我的目标是匹配双引号(“)之间引用的任何单引号('),所以它前面需要有奇数个双引号。我知道现在它只匹配第一组单引号,这很好。我最终将使用这个正则表达式替换第一个出现的,然后迭代并再次使用它替换其他出现的,只要有 以下是几个例子: “这是一个带有引号的随机句子,”,引号应匹配” “这
(?:"[^"]*"[^"]*)*?\"{1}([^"]*?([']{1,})[^"]*?)\"
这可能不是实现我想做的事情的最干净、最有效的方式,但我想我已经差不多做到了
我的目标是匹配双引号(“)之间引用的任何单引号('),所以它前面需要有奇数个双引号。我知道现在它只匹配第一组单引号,这很好。我最终将使用这个正则表达式替换第一个出现的,然后迭代并再次使用它替换其他出现的,只要有
以下是几个例子:
- “这是一个带有引号的随机句子,”,引号应匹配”
- “这里没有引用这就是问题所在”这里的任何内容都不应该匹配,但现在它匹配了:“
- “Some text”Some more text“这是一个引号:'应该匹配”
- “当这里有一个引号(')时,另一个不起作用:“'这很完美”,即使你删除第一个引号,这个:“(')”将使它起作用,因为贪婪(我认为),但如果你删除括号之间的引号,另一个到现在为止是匹配的,我不希望发生这种情况
- 另一个例子是这样的:以下内容不应该起作用,但它确实“这是被引用的”而不是这个:(')“这也是被引用的”
如果你打算迭代,我会考虑迭代来先抓住双引号中的所有东西,使用这个正则表达式: “(.*)” 这将在一对引号之间对所有内容进行非贪婪(第一)匹配 (请参阅此处引号之间的其他方法:)
一旦所有字符串都包含在成对的双引号中,匹配这些字符串中的任何单引号就变得很简单了。好吧,这里有一个正则表达式,它适用于所有示例,但是它有点长,并且不是真正完全可读。我希望我正确地获得了java模式的所有转义
(?:(?:^|\\G(?<!^)[^'\"]*\")[^\"]*+(?:"[^\"']*"[^\"]*)*+"|\\G(?<!^))[^'\"]*+(')
(?:(?:^| \\G(?)?
这利用了\G
-matcher,它将在最后一个模式的末尾进行匹配,并使用了可能的修饰符来避免不必要的回溯
让我们从结尾开始,[^'\“]*+(')
匹配任何捕获到组中的字符,这些字符不是单引号或双引号后跟单引号
\\G(?)在最后一次匹配结束时匹配((?)用于确保我们不在字符串的开头,因为这是第一次运行时,在匹配任何内容之前,\G
的位置。因此,如果上次匹配的双引号中有另一个单引号,我们将尝试
(?:^ | \\G(?)用于跳过双引号之外或不包含单引号的所有序列。^ | \\G(?((?:“[^\']”]*“[^\”]*)*+”
然后匹配任何不包含单引号和单引号外序列的双引号,直到到达双引号开始匹配单引号
但是我想一个演示比我能解释的要好得多,所以你在这里:我目前正在用Java做这件事,但是使用正则表达式做这件事还是很好的,而且/或者知道如何使用正则表达式做这件事!关于正则表达式的好处,这里有一个很好的观点,因为在很多情况下,使用你的程序来做处理会更有意义egex(实际上)不是一种编程语言,它是(希望)编程语言提供的众多工具之一。我认为你有一个错误的假设,那就是它前面必须有奇数个双引号(取决于允许的文本)。反例“\”呢“
?不使用正则表达式,您肯定应该使用堆栈。我不确定我是否理解您的意思,如果我们检查是否有奇数个“在它前面?这完全取决于你是否允许嵌套引号。不管怎样,正则表达式对于该作业来说是错误的工具。如果我在它前面添加另一个双引号,它将不匹配,这就是我的目标:“这是一些引用的文本”这不是“这是”,也许我不明白你的意思啊,不,不会有嵌套引号这似乎是匹配的,即使没有结束双引号。