1

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

说字符串是

    "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

提前致谢。

4

3 回答 3

1

使用环视,即替换:

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

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

(?<=")是积极的后视,检查前一个字符是 a ",但不包括在匹配中。
(?=")是积极的前瞻,检查下一个字符是 a ",但不包括在匹配中。

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

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

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

最终正则表达式:

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

我不确定它是干什么用.r的。

测试

于 2013-09-11T07:30:04.743 回答
0

如果你给的那个对你有用,那么这个应该可以正常工作

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

在这我已经使用了前瞻和后视,它们将匹配开头和结尾的 " 但不会将其包含在答案中。

于 2013-09-11T07:10:42.610 回答
0

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

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

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

每当有"下一个字符串时,它们将不是匹配的一部分。如果没有引号,则忽略模式的这一部分。最后的反向引用只是确保我们不匹配这样的字符串“xy”(它告诉:当有一个前导时"- 我们需要一个尾随。)

http://regex101.com/r/cU1xM6

于 2013-09-11T07:54:48.313 回答