java - 正则表达式匹配被双引号引用的单引号

标签 java regex

这是我一直在努力工作的正则表达式:

(?:"[^"]*"[^"]*)*?\"{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/

相关文章:

java - 如何在运行时实例化 Spring 托管 bean?

java - 请求的资源不可用。在 eclipse 上使用 tomcat 运行 spring mvc 程序

java - Android正则表达式制作

regex - 在 MS Access 2010 中使用正则表达式替换列

python - 正则表达式不返回任何结果

java - java中的动态复选框

java - 如何使用单个流操作从对象中获取多个值?

JAVA类型转换

正则表达式:如何 "step back"

python - 匹配字符串每个单词中的第一个元音并用正则表达式打印它们以逗号分隔?