0

输入字符串是

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

我只想得到"String 2"and "String 3", *but not "String )))1"

我使用这个表达式:

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

我做错了什么?

UPD。改变了

(?<!Resource\.T) 

(?<!Resource\.T\()

,但结果是

"), ", ", "

目前 :)

4

5 回答 5

3

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

 (?<!Resource\.T\()

就在 之前",如果没有Resource.T(之前,您必须查看,而不仅仅是Resource.T

编辑:
好的,所以要解决这个问题,我们将尝试查看"匹配后是否有一对:

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

所以,我们检查直到字符串的结尾是否有另一个",如果有,确保有第二个。
我认为这是最通用的方式(尽管可能不是最好的以性能为导向的方式)。

于 2013-04-12T12:17:40.137 回答
0
(?<!Resource\.T)("(?:\.|[^\")])*")
于 2013-04-12T12:07:35.210 回答
0

再次考虑这一点,我认为真正的问题是必须消耗“坏” Resource.T 字符串,因此您不应该使用零宽度断言。这就是抛出开头和结尾引号的原因。如果您将任何 Resource.T 匹配项包含在非捕获组中,那么您应该只取回其他匹配项:

(?:Resource\.T\("[^"]*"\))|("[^"]*")
于 2013-04-12T12:37:05.670 回答
0

正如 Loamhoof 所说,您需要在否定的后面添加“(”。但是,正如您所看到的,第一个匹配项是字符串 1 的结束引号与字符串 2 的开始引号匹配。如果您知道字符串赢了'没有逗号,你可以通过排除逗号来匹配:

(?<!Resource\.T\()("[^,"]*")
于 2013-04-12T12:23:43.683 回答
0

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

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

如果您的输入字符串总是像您的示例一样格式化,则无需费心复杂的环视正则表达式。
如果不是,当然,这是行不通的。

于 2013-04-12T12:38:07.650 回答