2008-10-27 127 views
29

我正在開發一種算法來解析一系列短字符串中的數字。這些字符串有點規則,但有一些不同的一般形式和幾個例外。我試圖建立一套正則表達式來處理各種形式和異常;我會一個接一個地申請他們,看看我是否得到一場比賽。匹配正則表達式中的可選子字符串

其中一種形式是這樣的:

X (Y) Z 

其中:

  • X是一個數字我想捕捉。
  • Z是靜態的,預先定義的文本。這基本上是我如何確定這種特殊形式是否適用。
  • Y是一個未知長度和內容的字符串,由括號包圍。

另外:Y是可選的;它並不總是出現在與Z和X.因此,一個字符串,我希望能夠從所有這些字符串的提取數量:

  • 10ž
  • 20(FOO)z
  • 30(條)z

現在,我有一個正則表達式,將捕獲的第一個:

([0-9]+) +Z 

我的問題是,我不知道如何構建一個正則表達式,它將匹配一系列字符,當且僅當它們被括在圓括號中。這可以在一個正則表達式中完成嗎?然而

([0-9]+) (\([^)]+\))? Z 

這不會與Y的嵌套的括號,工作,:

回答

46
(\d+)\s+(\(.*?\))?\s?Z 

請注意轉義括號和? (零次或一次)量詞。您不想捕獲的任何組可以是(?:非捕獲組)。

我同意這些空格。 \ s是更好的選擇。我還改變了量詞,以確保在開始時有數字。就換行而言,這取決於上下文:如果文件是逐行分析的,它不會成爲問題。另一個選項是錨定行的開始和結束(在前面添加^,在末尾添加$)。

+0

空格是靜態的。將它們替換爲\ s + – 2008-10-27 20:54:46

2

試試這個:

X (\(Y\))? Z 
7

你可以做到這一點。嵌套需要遞歸,不再是嚴格規則的(但是無上下文)。現代正則表達式引擎仍然可以處理它,雖然有一些困難(回參考)。

+1

幸運的是我不認爲我需要處理嵌套的parens。 – 2008-10-27 20:51:42

14

這應該工作:

^\d+\s?(\([^\)]+\)\s?)?Z$ 

還沒雖然測試,但讓我給你的故障,所以如果有任何錯誤,離開他們應該是相當簡單的發現:

首先開始:

^ = beginning of string 
\d+ = one or more decimal characters 
\s? = one optional whitespace 

那麼這部分:

(\([^\)]+\)\s?)? 

居然是:

(.............)? 

這使得下面的內容可選的,只有當它完全存在

\([^\)]+\)\s? 

\(= an opening bracket 
[^\)]+ = a series of at least one character that is not a closing bracket 
\) = followed by a closing bracket 
\s? = followed by one optional whitespace 

而最終是由

Z$ 

Z = your constant string 
$ = the end of the string 
相關問題