如何在包含第一次出现和排除第二次出现的同时获取序列的第一次和第二次出现之间的文本?
例如:
让我的序列= "xx - "
让我的文字为= "xx - blablabla bla blaxx - blablabla bla bla xx - blabla"
所以我希望我的正则表达式得到这个块:
"xx - blablabla bla bla"
我试过这样的事情:
^xx - .*xx -
但是这会在第一次和第三次出现之间得到文本,并且不会排除最后一次出现。
答案 0 :(得分:3)
(xx - )(.*?)\1
解释
(xx - ) # your sequence (group 1) (.*?) # anything, match non-greedily into group 2 \1 # whatever group 1 was
您想要第2组的内容。
请注意,正则表达式引擎使用不同类型的反向引用,\1
的最常见替代方法是$1
。
这就是为什么你的方法不起作用的原因:你的错误非常普遍。它包括认为.*
以某种方式神奇地停在正确的位置以让正则表达式的其余部分匹配。它不是。
.*
直接到行/字符串的末尾,没有任何考虑。那被称为“贪婪匹配”。当它到达字符串的末尾时,就会发生回溯。正则表达式的其余部分可以匹配的第一个点是序列的最后一次出现,从字符串的末尾看到。你最终得到了最长的比赛。
.*?
执行所谓的“非贪婪匹配”。它会在移动到下一个字符之前检查其余的正则表达式。这就是你的序列第一次出现的原因。你最终得到的是最短的比赛。
答案 1 :(得分:0)
取决于您的语言,
>> string="xx - blablabla bla blaxx - blablabla bla bla xx - blabla"
=> "xx - blablabla bla blaxx - blablabla bla bla xx - blabla"
>> string.split("xx -")[1]
=> " blablabla bla bla"
>> "xx -" + string.split("xx -")[1]
=> "xx - blablabla bla bla"
>>
对“xx - ”进行拆分。您想要的项目始终位于第2个位置,即索引1.添加“xx - ”以获取最终字符串。不需要太多正则表达式。