2017-08-05 121 views
1

我试图想出一个模式,以找到每个文本之间的双引号或单引号在java源代码。这是我有:正则表达式字符串与反斜杠逃脱

"(.*?)"|’(.*?)’ 

Debuggex Demo

这适用于几乎所有的情况下,我想,除了一个:

"text\"moretext\"evenmore" 

Debuggex Demo

这可以作为一个有效的字符串定义,因为报价是逃脱的。模式不能识别更多文本的内部部分。

任何有关这种情况的模式的想法?

回答

5

您可以使用此正则表达式匹配的单或双引号字符串忽略所有转义引号:

(["'])([^\\]*?(?:\\.[^\\]*?)*)\1 

RegEx Demo

正则表达式破碎:

  • (["']):配单​​或双引用并将其捕获在组#1中
  • (:开始捕获组#2
    • [^\\]*?:匹配0或更大的任何字符不是\
    • (?:`:启动非捕获组
      • \\:匹配一个\
      • .:后跟被转义
      • [^\\]*?任何字符:由0个或多个的任何非,接着个字符
    • )*:结束非捕获组。匹配0或多个该非捕获组
  • ):结束捕获组#2
  • \1:匹配闭单或双引号中组#匹配1
+1

十分感谢这似乎是工作,我发现一个其他的解决办法太:Debuggex演示](https://www.debuggex.com/r/sCEy0odJYlvw_M4R)这看起来更容易,也可以工作,wouldnt它? – cyden

+0

这并不简单,因为它不匹配单引号字符串。 – anubhava

+0

[Debuggex Demo](https://www.debuggex.com/r/IyVuenyKzBCaKgFU )。现在这个单引号,这个shoudl工作我猜。它不会识别“test \”,因为最后的反斜杠,但这也不是一个vaild字符串在java中定义,所以这种情况永远不会发生。或者我错了吗? – cyden

2

应工作:"([^"\\]|\\.)*"|'([^'\\]|\\.)*'Regexr test

说明:

  1. "匹配“。
  2. [^"\\]|\\.否定的\ &匹配 ”(即,使得它消耗\“)或继续的\和任何字符匹配。
  3. *继续比赛。 。
  4. "比赛

同为'

+1

它也可能与'“abc''匹配,并且不能正确匹配:''textmo”re“textevenmore'' – anubhava

+1

@anubhava编辑。 – BladeMight

+0

这个工作得很好,谢谢! – cyden

相关问题