2016-07-07 41 views
2

我想在這樣的表達式來分析和捕捉組:奇怪的詞或百分比的正則表達式的情況下

  • ABC =高清
  • ABC = 10
  • ABC = 10%
  • ABC = 10.0
  • ABC = 10.0%

但我無法將%的病例與下面的正則表達式匹配:

(\w+) *= *(\w+|\d+(?:\.\d+)?%?) 

Regular expression visualization

Debuggex Demo

什麼是最令人驚訝的是,如果我停止接受的話我可以匹配百分比 - 去除\w+

(\w+) *= *(\d+(?:\.\d+)?%?) 

我用debuggex並regex101瞭解爲什麼發生這種情況,但迄今爲止沒有成功。

+1

'( \ w +)* = *(\ w + | \ d +(?:\。\ d +)?%?)(?= \ n | $)' –

+0

您需要全局標誌。在regex101中,您可以在第二個框中鍵入g(在您的正則表達式旁邊鍵入g)時進行設置。而且,\ w也足夠,因爲它也可以接受數字。 –

回答

2

您可以使用:

/(\w+) *= *(\d+(?:\.\d+)?%?|\w+)/ 

即交替\w+之前符合您的數字,因爲\w還包括數字。

RegEx Demo

+1

我正要發佈相同的正則表達式......也保存在[Regex101](https://regex101.com/r/rX7aN3/1)上。 –

1

在最後加(?=\s|$)它應該工作。

(\w+) *= *(\w+|\d+(?:\.\d+)?%?)(?=\s|$) 

example

1

你已經有了一定的工作答案和建議,在這裏,但最簡單,最有效的性能明智的,是簡單地測試最複雜的變化第一。像...

(\w+) *= *(\d+(?:\.\d+)?%?|\w+) 

簡單的十進制數字測試第一,如果它可以將匹配它,否則繼續交替。

這在15個步驟中完成,而例如, (\w+) *= *(\w+|\d+(?:\.\d+)?%?)(?=\s|$)需要兩次。

See it here at regex101

+0

據我記得,如果OP沒有清楚地表達出來,你就不會關心*性能*。 *一切都會改變* – revo

+0

@revo性能上的優勢只是一個快樂的情況,從* fix *的簡單性來說,當在正確結果的兩個工作解決方案之間選擇*時,至少在我的情況下,會提示規模。 (伊莫你永遠不應該忽視表現,現在可能無所謂,但如果你可以免費(或便宜)),爲什麼不考慮呢?) – ClasG

+1

事實上,表現在複雜情況下最有意義,我不知道你是什麼意思的其他解決方案,但你的是@ anubhava的。晚會兩分鐘,最好刪除答案。 – revo

1

問題確實是\w+。這也匹配數字,並首先嚐試。
雖然\w+貪婪地匹配,完成表達式不。所以\w+匹配10(出於10.0%)並且匹配成功。由於我們取得了成功,因此無需嘗試\w+|\d+(?:\.\d+)?%?的替代路徑。


重新排序的正則表達式的工作原理:

(\w+) *= *(\d+(?:\.\d+)?%?|\w+) 

比賽abc = 10.0%完全。


另一個選擇是添加一個錨點。如果這個表達式需要匹配的完整生產線,加$,否則加你希望你的比賽後找什麼(如果需要的話非分組)的表達,例如(?:\s|$),製造的完整的表達:

(\w+) *= *(\w+|\d+(?:\.\d+)?%?)(?:\s|$)