2017-02-12 62 views
2

正則表達式換行我有一個正則表達式here at scriptular.com忽略不關心順序

/(?=.*net)(?=.*income)(?=.*total)(?=.*depreciation)/i 

如何讓我的正則表達式匹配成功的字符串?

沒有字符串中的換行符,正則表達式會成功。我可以刪除他們......但我寧願不。

+1

你只想匹配這些單詞嗎? –

+0

我不關心正則表達式匹配組,我只是想能夠使用regexObj.test(str)來查看字符串是否包含我想要的。是的,我只關心給出的例子的話。 – markain

+1

在JS中沒有可用於使點匹配換行符的標誌。解決方法是使用['\ s \ S]','[\ w \ W]'或'[^]'](https://www.regex101.com/r/hEeXMg/1)。爲避免超時,也可以考慮通過在'*'量詞之後加'''來將前視圖錨定到'''start並使用[lazy matching](http://www.regular-expressions.info/repeat.html#lazy)。 –

回答

2

1.)dot與除換行符以外的任何字符匹配。它不會跳過換行符,如果所需的單詞在第一行之後將與行匹配。在很多正則表達式中,有dotall單行s - flag可用於使點也匹配換行符,但不幸的是不在JS正則表達式中。

解決方法是使用包含任何字符的character class。如[\s\S]任何空白字符與任何非空白\S[\w\W]任何字字符連同任何非單詞字符沒有什麼而不是點甚至[^]\s在一起。

2.)Anchor向前看到^字符串的開頭,因爲它不想在字符串中的任何位置重複lookahead。這將大大提高性能。

3.)使用lazy matching表示滿意每個單詞的第一個匹配。

/^(?=[\s\S]*?net)(?=[\s\S]*?income)(?=[\s\S]*?total)(?=[\s\S]*?depreciation)/i 

See demo at regex101(說不上來爲什麼,這並不在您的演示工具工作)

此外,您可以用身邊的話\b word boundaries爲確保諸如net不會brunetnetwork匹配.. 。所以正則表達式變成^(?=[\s\S]*?\bnet\b) ...