2016-01-20 38 views
0

回答模式是否可以在字符串中找到的問題。 (僅truefalse答案。如果還是多少不是問題。)安全地從正則表達式中刪除前導或尾隨*。

假設正則表達式中不包含重複的佔有慾,是它總是安全地刪除尾隨或從模式字符串領先.*.*??例如,find('.*blah.*', x)保證返回與find('blah', y)相同的結果。

如果第一個問題的答案是「否」,那麼如果在正則表達式模式中只允許re2的語法?

+0

您可以刪除'。* * * *,除非* find *中的模式默認爲錨定。 '發現'錨定模式? –

回答

1

閱讀RE2 docs

任何字符,可能包括換行(S =真).

然後

s.匹配\n默認

所以,.*除換行符以外的零個或多個字符匹配。

沒有/s修改,領先.*會找到比在同一行上一個新行與blah其他零個或多個字符,直到最後blah。使用/s,它將查找從字符串開始直到字符串中最後一個blah的所有子字符串。當您省略前導.*時,正則表達式引擎將嘗試匹配字符串中的第一個blah

如果find不錨圖案,它是安全的忽略它的兩端,並find('.*blah.*', x)會產生相同的布爾結果find('blah', y)。否則,它不會。 字符串結果可能會有所不同。

+0

謝謝你的迴應。我更擔心''*?'的情況,在那裏刪除'。*'會給我留下一個'?',這會改變正則表達式的含義。我想我的問題中我沒有強調這一點。此外,抱歉,以前沒有回覆。 – Haozhun

+0

'。*?'模式匹配回溯允許它的後續子模式的第一次出現之前的任何字符。如果您立即知道後面的b,您應該只刪除它。同樣如此。*,它只匹配後續子模式的最後一次出現。 –

相關問題