输入字符串是
@"SomeCall(Resource.T(""String )))1""), ""String 2"", ""String 3"");"
我想只获得"String 2"
和"String 3"
,*但不 "String )))1"
。
我使用这个表达式:
(?<!Resource\.T)("(?:\.|[^\"])*")
我做错了什么?
UPD。已更改
(?<!Resource\.T)
到
(?<!Resource\.T\()
,但结果是
"), ", ", "
现在:)
答案 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\(""[^"]*""\), ""([^"]*)"", ""([^"]*)""\);"
如果你的输入字符串总是像你的例子一样格式化,那么就没有必要打扰复杂的环视正则表达式。
如果不是,那当然不行。