Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正则表达式匹配由双引号引用的单引号_Java_Regex - Fatal编程技术网

Java 正则表达式匹配由双引号引用的单引号

Java 正则表达式匹配由双引号引用的单引号,java,regex,Java,Regex,这是一个我一直在努力实现的正则表达式: (?:"[^"]*"[^"]*)*?\"{1}([^"]*?([']{1,})[^"]*?)\" 这可能不是实现我想做的事情的最干净、最有效的方式,但我想我已经差不多做到了 我的目标是匹配双引号(“)之间引用的任何单引号('),所以它前面需要有奇数个双引号。我知道现在它只匹配第一组单引号,这很好。我最终将使用这个正则表达式替换第一个出现的,然后迭代并再次使用它替换其他出现的,只要有 以下是几个例子: “这是一个带有引号的随机句子,”,引号应匹配” “这

这是一个我一直在努力实现的正则表达式:

(?:"[^"]*"[^"]*)*?\"{1}([^"]*?([']{1,})[^"]*?)\"
这可能不是实现我想做的事情的最干净、最有效的方式,但我想我已经差不多做到了

我的目标是匹配双引号(“)之间引用的任何单引号('),所以它前面需要有奇数个双引号。我知道现在它只匹配第一组单引号,这很好。我最终将使用这个正则表达式替换第一个出现的,然后迭代并再次使用它替换其他出现的,只要有

以下是几个例子:

  • “这是一个带有引号的随机句子,引号应匹配”
  • “这里没有引用这就是问题所在”这里的任何内容都不应该匹配,但现在它匹配了:
  • “Some text”Some more text“这是一个引号:'应该匹配
  • “当这里有一个引号(')时,另一个不起作用:“'这很完美”,即使你删除第一个引号,这个:“(')”将使它起作用,因为贪婪(我认为),但如果你删除括号之间的引号,另一个到现在为止是匹配的,我不希望发生这种情况
  • 另一个例子是这样的:以下内容不应该起作用,但它确实“这是被引用的”而不是这个:(')“这也是被引用的”
请注意,我真的不认为自己是专家,几天前我几乎什么都不知道,除了经典[AZ-Z0-9]…欢迎任何帮助,我可能忽略了一些基本的东西

我一直在这里工作:

如果你打算迭代,我会考虑迭代来先抓住双引号中的所有东西,使用这个正则表达式:

“(.*)”

这将在一对引号之间对所有内容进行非贪婪(第一)匹配

(请参阅此处引号之间的其他方法:)


一旦所有字符串都包含在成对的双引号中,匹配这些字符串中的任何单引号就变得很简单了。

好吧,这里有一个正则表达式,它适用于所有示例,但是它有点长,并且不是真正完全可读。我希望我正确地获得了java模式的所有转义

(?:(?:^|\\G(?<!^)[^'\"]*\")[^\"]*+(?:"[^\"']*"[^\"]*)*+"|\\G(?<!^))[^'\"]*+(')
(?:(?:^| \\G(?)?
这利用了
\G
-matcher,它将在最后一个模式的末尾进行匹配,并使用了可能的修饰符来避免不必要的回溯

让我们从结尾开始,
[^'\“]*+(')
匹配任何捕获到组中的字符,这些字符不是单引号或双引号后跟单引号

\\G(?)在最后一次匹配结束时匹配(
(?)用于确保我们不在字符串的开头,因为这是第一次运行时,在匹配任何内容之前,
\G
的位置。因此,如果上次匹配的双引号中有另一个单引号,我们将尝试

(?:^ | \\G(?)用于跳过双引号之外或不包含单引号的所有序列。
^ | \\G(?((?:“[^\']”]*“[^\”]*)*+”
然后匹配任何不包含单引号和单引号外序列的双引号,直到到达双引号开始匹配单引号


但是我想一个演示比我能解释的要好得多,所以你在这里:

我目前正在用Java做这件事,但是使用正则表达式做这件事还是很好的,而且/或者知道如何使用正则表达式做这件事!关于正则表达式的好处,这里有一个很好的观点,因为在很多情况下,使用你的程序来做处理会更有意义egex(实际上)不是一种编程语言,它是(希望)编程语言提供的众多工具之一。我认为你有一个错误的假设,那就是它前面必须有奇数个双引号(取决于允许的文本)。反例
“\”呢“
?不使用正则表达式,您肯定应该使用堆栈。我不确定我是否理解您的意思,如果我们检查是否有奇数个“在它前面?这完全取决于你是否允许嵌套引号。不管怎样,正则表达式对于该作业来说是错误的工具。如果我在它前面添加另一个双引号,它将不匹配,这就是我的目标:“这是一些引用的文本”这不是“这是”,也许我不明白你的意思啊,不,不会有嵌套引号这似乎是匹配的,即使没有结束双引号。