2016-08-23 33 views
0

我試圖寫java正則表達式匹配各種像場 -複雜的Java正則表達式來匹配不同領域的

用戶名
用戶ID
USER_ID
USER_LOGIN
vb_login_username
LOGIN_ID
USER_NAME
用戶
uname
txtusername
爲j_username
adminName
loginuser
webvars.username
josso%5Fusername
lems.username
tl_login
_58_login
用戶ID
pppoe_authentication_username
用戶
os_username
登錄 LOGIN_ID
login_info
proxy_login
remote_login
authorization_username
auth_username
default_username
username_raw

我想是這樣 -

String pattern1 = "(.*)((?:user|login|u)(?:(?<=_)(?=(?:name|id))))(.*)"; 

但它並不適用於所有的領域。

我想我需要寫條件正則表達式,例如如果在「用戶」或「登錄」字符串之後有「_」或「 - 」,那麼在「_」後面應該有「info」或「name」。

如果下劃線不存在,那麼在「用戶」或「登錄」之後不應有任何內容。

感謝,
薩欽

+1

讓我們讓我們的生活變得簡單。如何使用'input.contains(「user」)|| input.contains(「name」)|| input.contains(「login」)'? –

+1

'clasg_the_amuser';)應該匹配嗎? – ClasG

+0

還有其他字段,例如user_email或login_server,我想忽略。 –

回答

-1

這是一個真正複雜的任務,但是這可能需要你在路上了一下:

(?!.*(email|server))(^|\b|_)(login|user)(?:[_-]?(?:name|id|login|user))? 

See it here at regex101

(Just)在開始時添加了負面預測,以禁止某些單詞。然後進行單詞loginuser的測試,然後是可選的_-,隨後是name,id,loginuser中的任一個。

它並沒有完全完成這項工作,但結合了前面的答案(刪除)和xenteros'es,它可能會這樣做。

它匹配您示例中的所有字段,但uname,txtusernamejosso%5Fusername除外。所以你可以把這些作爲一個單獨的選項,或使正則表達式更復雜(不,不!)

+0

當人們發現我花時間想出一個需要幫助的人的解決方案時,總是很欣慰,決定在不留下評論的情況下向下投票**:@。 – ClasG

+0

非常感謝您的回覆和努力。在經過評論/回答之後,我認爲最好有一組字符串,並且對於每個輸入字符串,我們可以檢查該輸入是否存在於集合中。
這是更高性能的正則表達式或查找集,因爲我的應用程序以非常高的速率接收輸入。 –

0

您可以使用以下模式:

String pattern = "username|userid|user_id|user_login|vb_login_username|login_id|user_name|user|uname|txtusername|j_username|adminName|loginuser|webvars.username|josso%5Fusername|lems.username|tl_login|_58_login|user-id|pppoe_authentication_username|user|os_username|login|login_id|login_info|proxy_login|remote_login|authorization_username|auth_username|default_username|username_raw"; 

你可以看到,它不是使用regex最好的方法?所有其他模式或者是這種模式的變體,或者會接受更多的令牌,然後你想要。

regex定義了一種常規語言。如果一個正則語言的詞數有限,那麼包含所有替代詞的正則表達式就可以。你可以嘗試找到一個minimal dfa,然後將其轉換爲正則表達式,但相信我:這不是你想要遵循的方式。

+0

非常感謝您的回覆。這個正則表達式會更快,還是將這些字符串設置爲set,並在這個集合中查找輸入? –

+0

理論上它應該是並行實現,所以它會更快。 – xenteros

+0

我在我的應用程序中有線程...但其中的一個會比其他有優勢嗎? –