这里有一个Regex,我一直在努力让它发挥作用:
(?:"[^"]*"[^"]*)*?\"{1}([^"]*?([']{1,})[^"]*?)\"
这可能不是实现我想要做的事情的最干净和最有效的方法,但我想我已经快到了。
我的目标是在双引号(")之间匹配任何被引用的单引号(') ,所以在它前面需要有一个奇怪的双引号。我知道现在它只匹配第一组单引号,这很好。我最终会使用这个正则表达式来替换第一个出现的值,然后迭代并再次使用它来替换其他的单引号,只要有一些。
以下是几个例子:
请注意,我真的不认为自己是一个专家,几天前我几乎什么都不知道,除了经典的a-za-z0-9.任何帮助都是受欢迎的,我可能忽略了一些基本的东西。
我一直在这里工作:https://regex101.com/r/aE7iB8/1
发布于 2016-03-23 11:20:30
好吧,这是一个对所有样本都有效的正则表达式--但是它有点长,而且并不是完全可读的。我希望java模式的所有转义都是正确的。
(?:(?:^|\\G(?<!^)[^'\"]*\")[^\"]*+(?:"[^\"']*"[^\"]*)*+"|\\G(?<!^))[^'\"]*+(')
这利用了\G
-matcher (将在最后一个模式的末尾匹配)和后置修饰符,以避免不必要的回溯。
让我们从结尾开始,[^'\"]*+(')
匹配任何字符,不是单引号或双引号,后面是单引号,它被捕获到组中。
\\G(?<!^)
匹配在最后一次匹配的末尾( (?<!^)
用于确保我们不在字符串的开头,因为这是\G
在第一次运行中的位置,在任何匹配之前)。因此,我们将尝试,如果有另一个单引号在双引号中,我们在上一场比赛。
(?:^|\\G(?<!^)[^'\"]*\")[^\"]*+(?:"[^\"']*"[^\"]*)*+"
用于跳过所有不在双引号或不包含单引号的序列。如果没有其他单引号,^|\\G(?<!^)[^'\"]*\"
将匹配字符串的开始(第一次匹配)或匹配,直到最后一次匹配的结束双引号为止。然后,[^\"]*+
匹配任何不是双引号的内容。然后,(?:"[^\"']*"[^\"]*)*+"
匹配不包含单引号和单引号之外的序列的任何双引号,直到我们到达开始匹配单引号的双引号为止。
但是我想一个演示展示的效果比我能解释的要好得多,所以下面是:https://regex101.com/r/tW5xH4/1
发布于 2016-03-23 10:28:12
如果您计划以任何方式迭代,我会考虑先迭代以获取双引号中的所有内容,然后使用以下正则表达式:
"(.*?)“
这做了一个非贪婪(首先)匹配之间的引号之间的一切。
(请参阅其他在引号之间获取内容的方法:RegEx: Grabbing values between quotation marks)
一旦在双引号对中包含了所有字符串,那么匹配这些字符串中的任何单引号将是非常简单的。
https://stackoverflow.com/questions/36183788
复制相似问题