正则表达式问题。找到所需的字符串

时间:2013-04-12 12:02:15

标签: .net regex

输入字符串是

@"SomeCall(Resource.T(""String )))1""), ""String 2"", ""String 3"");"

我想只获得"String 2""String 3",*但 "String )))1"

我使用这个表达式:

 (?<!Resource\.T)("(?:\.|[^\"])*")

我做错了什么?

UPD。已更改

(?<!Resource\.T) 

(?<!Resource\.T\()

,但结果是

"), ", ", "

现在:)

5 个答案:

答案 0 :(得分:3)

你的后视不太正确,这就是为什么它不起作用。将其更改为:

 (?<!Resource\.T\()

"之前,您必须先查看之前是否有Resource.T(,而不仅仅是Resource.T

修改
好的,为了解决这个问题,我们会尝试查看匹配后是否有一对"

(?<!Resource\.T\()("(?:\.|[^\"])*")(?=(?:[^"]|"[^"]*")*$)

因此,如果有另一个",我们会检查字符串的结尾,如果有,请确保有第二个。
我认为这是最常用的方式(可能不是最好的性能导向)。

答案 1 :(得分:0)

(?<!Resource\.T)("(?:\.|[^\")])*")

答案 2 :(得分:0)

正如Loamhoof所说,你需要添加“(”在负面看后面。但是,如你所见,第一个匹配是字符串1的结尾引用与字符串2的开头引用匹配。如果你知道字符串中没有逗号,您可以通过排除逗号进行匹配:

(?<!Resource\.T\()("[^,"]*")

答案 3 :(得分:0)

再次考虑这个问题,我认为真正的问题是必须消耗“坏”的Resource.T字符串,所以你不应该使用零宽度断言。这就是抛弃开头和结束报价的原因。如果您在非捕获组中包含任何Resource.T匹配,那么您应该只返回其他组:

(?:Resource\.T\("[^"]*"\))|("[^"]*")

答案 4 :(得分:0)

输入格式有多严格?
这可以吗?

@"SomeCall\(Resource.T\(""[^"]*""\), ""([^"]*)"", ""([^"]*)""\);"

如果你的输入字符串总是像你的例子一样格式化,那么就没有必要打扰复杂的环视正则表达式。
如果不是,那当然不行。