2016-08-23 32 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

我在我的应用程序中有线程...但其中的一个会比其他有优势吗? –