在捕获组中转义正则表达式

时间:2013-09-11 07:04:31

标签: java regex

我必须提取字符串的一部分

说字符串是

    "this is a string "xyz" "

我想从这里提取的是字符串

    xyz

但问题是我有2个相同字符串的变种。

"this is a string "xyz" "
"this is a string - "

我想提取

    xyz or -

我尝试过一个提取器

    ".*((?:")[^"]*(?:")|-).*".r

这个提取 - 好吧,它也提取字符串,但我不排除引号。 当我给出如上所述的2个字符串时得到的结果如下

    "xyz" instead of xyz
    - as expected

提前致谢。

3 个答案:

答案 0 :(得分:1)

使用look-around ,即替换:

(?:")[^"]*(?:")

(?<=")[^"]*(?=")

(?<=")是肯定的后卫,检查前一个字符是",但不会在匹配中包含它。
(?=")是正向前瞻,检查下一个字符是",但不会在匹配中包含它。

如果您在较大字符串中搜索,则可能还需要.*替换为.*? .*?将匹配尽可能少的字符,其中.*将尽可能多地匹配。例如,给定abbbaabbba

a.*a  finds abbbaabbba as one match
a.*?a finds abbba and abbba separately

这些更改引入了一个新问题,因为环顾可以尝试匹配外部大括号,而普通匹配则不能。如果您.*替换为.+ ,则应该可以防止此问题(假设这对-匹配有效,引号匹配应为同样因为使用环视而来。)

最终正则表达式:

".+((?<=")[^"]*(?=")|-).+"

我不确定.r的用途。

Test

答案 1 :(得分:0)

如果你给的那个人为你工作,那么这个应该可以正常工作

(?<=").*((?:")[^"]*(?:")|-).*(?=")

在这里我使用了前瞻和后面他们将匹配“在开始和结束但不会在答案中包括它。

答案 2 :(得分:0)

对于您提供的示例,您不需要环顾四周。

您可以简单地使用反向引用来确保“包裹”目标的所有内容都是" - 或者没有:

^this is a ("|)([^"\s]+)(\1)\s*$

每当下一个字符串周围有"时,它们就不属于匹配项。 如果没有引号,则忽略该模式的这一部分。最后的反向引用确保我们不匹配像这样的字符串“xy (它告诉:WHENEVER有一个前导" - 我们需要一个尾随的。” / p>

http://regex101.com/r/cU1xM6