这是我一直在努力工作的正则表达式:
(?:"[^"]*"[^"]*)*?\"{1}([^"]*?([']{1,})[^"]*?)\"
这可能不是实现我想做的事情的最干净也不是最有效的方法,但我认为我快成功了。
我的目标是匹配双引号 (") 之间的任何单引号 (') ,因此需要奇数个双引号在它前面。我知道现在它只匹配第一组单引号,没关系。我最终会使用这个正则表达式来替换第一次出现的,然后迭代并再次使用它来替换其他的,只要有一些.
这里有几个例子:
- “这是一个带有引号的随机句子',引号应该匹配”
- "There is no quote here here that's the problem"这里的任何内容不应该匹配但现在匹配:'。
- "Some text "some more text "这是一个引号:'应该匹配"
- "当这里有一个引号 (') 时,另一个不起作用:"' 而且那是完美的 "即使你删除了第一个:"(') "也会让它起作用,因为贪婪 (我认为 ) 但如果你删除括号之间的那些,另一个现在匹配,我不希望发生这种情况。
- 另一个例子是这个:下面应该不起作用,但它确实“This is being quoted”不是这个:(')“并且这也被引用”
请注意,我真的不认为自己是专家,几天前我除了经典的 [a-zA-Z0-9] 几乎一无所知......欢迎任何帮助,我可能忽略了一些基本的东西。
我一直在这里工作: https://regex101.com/r/aE7iB8/1
最佳答案
好吧,这里有一个适用于所有示例的正则表达式 - 但它有点长,而且可读性不是很好。我希望我正确地获得了 Java 模式的所有转义。
(?:(?:^|\\G(?<!^)[^'\"]*\")[^\"]*+(?:"[^\"']*"[^\"]*)*+"|\\G(?<!^))[^'\"]*+(')
这利用了 \G
-匹配器,它将匹配最后一个模式和所有格修饰符的末尾,以避免不必要的回溯。
让我们从最后开始,[^'\"]*+(')
匹配捕获到组中的任何字符,不是单引号或双引号后跟单引号。
\\G(?<!^)
在最后一场比赛结束时比赛((?<!^)
用于确保我们不在字符串的开头,因为这是第一次运行中 \G
的位置,在任何匹配之前。所以我们将试试看,如果我们在上一场比赛中的双引号内有另一个单引号。
(?:^|\\G(?<!^)[^'\"]*\")[^\"]*+(?:"[^\"']*"[^\"]*)*+"
用于跳过所有在双引号外或不包含单引号的序列。 ^|\\G(?<!^)[^'\"]*\"
如果内部没有其他单引号,则匹配字符串的开头(第一个匹配项)或匹配到我们最后一个匹配项的结束双引号。 [^\"]*+
然后匹配任何不是双引号的东西。 (?:"[^\"']*"[^\"]*)*+"
然后匹配任何不包含单引号的双引号和单引号外的序列,直到我们到达开始匹配单引号的双引号。
但我想一个演示比我解释得更好,所以你在这里:https://regex101.com/r/tW5xH4/1
关于java - 正则表达式匹配被双引号引用的单引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36183788/