2016-08-01 62 views
-1

我有2個不同的字符串像正則表達式匹配的錯誤表達

abs1.qwerty.com:1234 

abs11qwerty.com:1234 

使用這樣的正則表達式"(?=" + name + ").*?:(\\d+)",其中名稱是給定的字符串之後。我收到錯誤的匹配,因爲它假定它們是相同的。什麼可以解決這個問題?

+2

1)格式化您的代碼。 2)提供示例輸入和預期輸出。 3)提供實際產出。 –

回答

2

你需要正則表達式轉義name - 這是經典的注入攻擊

如果name有正則表達式的字符在它的引擎將它們解釋它們作爲模式的一部分,例如

name = ".*" 

很可能會匹配所有的名稱,允許攻擊者從系統中提取數據。

使用類似以下內容:

final String pattern = String.format("(?=%s).*?:(\\d+)", Pattern.quote(name)) 

在你的榜樣,如果模式abs1.qwerty.com正則表達式引擎解釋是這樣的:

  • 「ABS1」 - 字面
  • 「」 - 任何字符,一次
  • 「qwerty」 - 字面值
  • 「。」 - 任何字符,一旦
  • 「COM」 - 字面

因此模式匹配愉快 「abs11qwerty.com」。