我必须提取字符串的一部分
说字符串是
"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
提前致谢。
答案 0 :(得分:1)
使用look-around ,即替换:
(?:")[^"]*(?:")
与
(?<=")[^"]*(?=")
(?<=")
是肯定的后卫,检查前一个字符是"
,但不会在匹配中包含它。
(?=")
是正向前瞻,检查下一个字符是"
,但不会在匹配中包含它。
如果您在较大字符串中搜索,则可能还需要将.*
替换为.*?
。 .*?
将匹配尽可能少的字符,其中.*
将尽可能多地匹配。例如,给定abbbaabbba
:
a.*a finds abbbaabbba as one match
a.*?a finds abbba and abbba separately
这些更改引入了一个新问题,因为环顾可以尝试匹配外部大括号,而普通匹配则不能。如果您将.*
替换为.+
,则应该可以防止此问题(假设这对-
匹配有效,引号匹配应为同样因为使用环视而来。)
最终正则表达式:
".+((?<=")[^"]*(?=")|-).+"
我不确定.r
的用途。
答案 1 :(得分:0)
如果你给的那个人为你工作,那么这个应该可以正常工作
(?<=").*((?:")[^"]*(?:")|-).*(?=")
在这里我使用了前瞻和后面他们将匹配“在开始和结束但不会在答案中包括它。
答案 2 :(得分:0)
对于您提供的示例,您不需要环顾四周。
您可以简单地使用反向引用来确保“包裹”目标的所有内容都是"
- 或者没有:
^this is a ("|)([^"\s]+)(\1)\s*$
每当下一个字符串周围有"
时,它们就不属于匹配项。
如果没有引号,则忽略该模式的这一部分。最后的反向引用确保我们不匹配像这样的字符串“xy (它告诉:WHENEVER有一个前导"
- 我们需要一个尾随的。” / p>