我必须提取字符串的一部分
假设字符串是
"this is a string "xyz" "
我想从这里提取的是字符串
xyz
但问题是我有同一个字符串的两个变体。
"this is a string "xyz" "
"this is a string - "
我要提取
xyz or -
我尝试过提取器
".*((?:")[^"]*(?:")|-).*".r
这提取 - 好吧,它也提取字符串,但我不排除引号。 当我给出上面提到的2个字符串时得到的结果如下
"xyz" instead of xyz
- as expected
提前致谢。
最佳答案
使用look-around ,即替换:
(?:")[^"]*(?:")
与
(?<=")[^"]*(?=")
(?<=")
是正向后查找,检查前一个字符是否为 "
,但不将其包含在匹配中。
(?=")
是积极的前瞻,检查下一个字符是否是 "
,但不将其包含在匹配中。
如果您要在较大的字符串中搜索此内容,您可能还需要替换 .*
与 .*?
。 .*?
将匹配尽可能少的字符,其中 .*
将匹配尽可能多的。举个例子,给定 abbbaabbba
:
a.*a finds abbbaabbba as one match
a.*?a finds abbba and abbba separately
这些更改引入了一个新问题,因为环视可以尝试匹配外部大括号,而普通匹配则不能。如果您替换 .*
与.+
,它应该可以防止这个问题(假设这对于 -
匹配有效,由于使用了环视,引号匹配应该是相同的)。
最终正则表达式:
".+((?<=")[^"]*(?=")|-).+"
我不确定.r
是什么是为了。
Test .
关于java - 在捕获组中转义正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18734726/