2017-06-21 62 views
1

我想寫一個正則表達式(用於Java模式),將匹配字符串可能有一個字母,可能後跟一個空格然後數字,但必須至少有一個。例如,下面的字符串應當匹配:正則表達式與兩個選項中的至少一個,但在序列

  • 「5」
  • 「b 9分配」
  • 「8」

然而,它不應該匹配空字符串(」 「)。

此外,我想讓每個組件成爲一個命名的捕獲組。

以下工作,但允許空字符串。

"(?<let>\\p{Alpha})?((?<num>\\p{Digit}))?" 
+0

你想要匹配單個字母,例如'p'? – anubhava

+0

你想匹配空間嗎? –

+0

是的,我只想匹配一個字母但不是,單個空格不匹配。 – elsaturnino

回答

3

爲了確保有其中至少有一個,你可以在開始時使用前瞻(?=\\p{Alpha}| \\p{Digit})

"(?=\\p{Alpha}| \\p{Digit})(?<let>\\p{Alpha})?((?<num>\\p{Digit}))?" 

一般情況下,爲了避免您可以使用(?=.)空字符串。

0

可以解決問題:

([a-z]? \d)|([a-z] \d?) 

你可以看到這個代碼覆蓋測試案例演示here。你可以在這裏看到演示代碼。這是非常基本的正則表達知識,您應該更多地瞭解正則表達式,網上有很多好的教程(例如這個)。

+0

這不能僅僅匹配字母(例如「a」)。 – horcrux

+0

感謝您的反饋,我誤解了。我已經更新了答案:) –

+0

是的,我知道那個正則表達式,但它並沒有完全解決我的問題。問題是我想要命名捕獲組,並且我希望該信件總是具有相同的捕獲組名稱'let',並且該數字具有組名'num'。 – elsaturnino

0

您可以使用|爲或,然後簡單地重複「任何模式」來匹配這樣的一切。

((?<let>[A-z])|(?<num>\d)\s*)+ 

可讓您以任意順序匹配任意數量的命名模式。

1

可以使用負前瞻,以避免空的輸入,並保持你的正則表達式爲:

^(?!$)(?<let>\p{L})?(?:\h+(?<num>\p{N}))?$ 

RegEx Demo

(?!$)爲負先行失敗的比賽爲空字符串。

相關問題