Java 正则表达式提取带有两个点分隔部分的hashtag
我试图创建一个正则表达式,以便从字符串中提取一些文本。我想从URL或普通文本消息中提取文本,例如:Java 正则表达式提取带有两个点分隔部分的hashtag,java,regex,Java,Regex,我试图创建一个正则表达式,以便从字符串中提取一些文本。我想从URL或普通文本消息中提取文本,例如: endpoint/?userId=#someuser.id 或 我想从这两个方面准确地从消息中提取#someuser.name,从url中提取#someuser.id。可能有许多这样的字符串要从url和消息中提取 我的正则表达式当前如下所示: (#[^\.]+?\.)([^\W]\w+\b) 它工作正常,除了一对一的情况,我不知道怎么做-例如: 这些字符串不应匹配:#.id,#.id。在#和之
endpoint/?userId=#someuser.id
或
我想从这两个方面准确地从消息中提取#someuser.name
,从url中提取#someuser.id
。可能有许多这样的字符串要从url和消息中提取
我的正则表达式当前如下所示:
(#[^\.]+?\.)([^\W]\w+\b)
它工作正常,除了一对一的情况,我不知道怎么做-例如:
这些字符串不应匹配:#.id
,#.id
。在#
和
之间必须至少有一个字符。这些字符之间的一个或多个空格不应匹配
如何使用当前的正则表达式执行此操作?您可以尝试以下正则表达式:
#(\w+)\.(\w+)
注意事项:
String input = "endpoint/?userId=#someuser.id Hi #someuser.name, how are you? # .id, #.id.";
Matcher m = Pattern.compile("#(\\w+)\\.(\\w+)").matcher(input);
while (m.find()) {
System.out.println(m.group());
}
#someuser.id
#someuser.name
- 如果不想捕获任何组,请删除括号
- 在java正则表达式字符串中,需要转义每个
\
- 这就产生了
#(\\w+\ \。(\\w+)
- 如果
仅由数字构成,则可以通过id
[0-9]
- 如果
包含字母、数字和下划线以外的字符,则必须将用户名
更改为一个字符类,并明确定义所有授权字符\w
String input = "endpoint/?userId=#someuser.id Hi #someuser.name, how are you? # .id, #.id.";
Matcher m = Pattern.compile("#(\\w+)\\.(\\w+)").matcher(input);
while (m.find()) {
System.out.println(m.group());
}
#someuser.id
#someuser.name
输出:
String input = "endpoint/?userId=#someuser.id Hi #someuser.name, how are you? # .id, #.id.";
Matcher m = Pattern.compile("#(\\w+)\\.(\\w+)").matcher(input);
while (m.find()) {
System.out.println(m.group());
}
#someuser.id
#someuser.name
结果两组均为阴性
endpoint/?userId=#someuser.id -> group[0]=someuser and group[1]=id
重新定义的要求是:
- 我们搜索模式
#A.B
可以是除空格以外的任何内容,也不能包含A
或#
只能是常规ASCII字母或数字B
String regex = "#[^.#]*[^.#\\s][^#.]*\\.\\w+";
见和:
详细信息
-一个#
符号#
-除[^.#]*
和
-除了[^.#\\s]
、
和空白之外的任何字符
-除[^#.]*
和
-一个点\。
-1+字字符(字母、数字或\w+
)\u
#someuser.id
#someuser.name
这不是我不需要的。我只需要一个组,并且应该可以使用#和之间的空格。但前提是还有其他角色。示例中的“第二组”中的空格是非法的。所以我可以有那些字符串:#someuser.id,#someuser.id,但我不能有那些:#id,#id,#someuser.id,我可以让你试试这个(#\w++\w*\w+)你会得到#someuser.id,#someuser.id,但不是#.id,#虽然很接近,但应该可以在#和之间使用空格。但前提是还有其他角色。示例中的“第二组”中的空格是非法的。所以我可以有那些字符串:#someuser.id,#someuser.id,但我不能有那些:#.id,#.id,#someuser。我在#和之间的第一个单词中打钩。应该可以在点之前使用所有特殊字符,如()-*etcspace,但不能after@Allan这也将匹配第二个测试用例中的逗号(
#someuser.name,
,而不是#someuser.name
)。总之,这个问题的要求不够明确。。哪些字符是和不允许的。@凯文·克鲁伊森让我把它分成两组,第一组是介于#和点之间的所有字符,第二组是介于点和任何特殊字符之间的所有字符。第一组:当然可以有每个特殊字符,而不是点和#。可以有空格,但不仅空格和里面的“某物”可能不是空的,所以“#.id”也不可能。第二组可能没有特殊字符-此处只能使用字母和数字,第二组中也不能使用空格。如果第二个组有特殊字符,这意味着matchingTry字符串regex=“#[^.]*[^.\\s][^.]*(?:\\.\\w+*”)结束代码>。或String regex=“#[^.]*[^.\\s][^.]*\.\\w+”
如果您想匹配#
和后面用
分隔的两个部分,请检查上面注释中的第二个正则表达式。@WiktorStribiżew如此接近!只有一个字符串不应匹配,但它是。例如:###。id“#”字符是非法的,哈希仅表示有一些标记要匹配,但它可能不会用作可用的特殊字符之一。请尝试从第一组中排除
,“\[^.\35;]*[^.\\\\\\\\\\\\\\\\ w+”
,请参阅@wikttribi!)现在一切都正常了,谢谢:)这真的很接近我想要的,但是有匹配的,应该匹配的,例如:#id。在“A”中不应使用ony空格,因此#[space][space]。id现在匹配为正确,但不应匹配be@Carath#[space][space].id
在我上面的代码中不匹配。。这是由\\s
之后的+
阻止的。你是说允许使用#[space][space].id
,但不允许使用#[space].id
?在这种情况下,您可以删除+
。或者您是说应该匹配#[tab].id
,但是#[space].id
不是,在这种情况下,\\s
(空格和制表符(如果启用了多行选项,则为换行符,此处不是这种情况))可以替换为“`”?老实说,我真的不理解你的评论。@KevinCruijssen:是的,没有明确的要求,很难找到“好的答案”这就是我想要的,谢谢:)