Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正则表达式提取带有两个点分隔部分的hashtag_Java_Regex - Fatal编程技术网

Java 正则表达式提取带有两个点分隔部分的hashtag

Java 正则表达式提取带有两个点分隔部分的hashtag,java,regex,Java,Regex,我试图创建一个正则表达式,以便从字符串中提取一些文本。我想从URL或普通文本消息中提取文本,例如: endpoint/?userId=#someuser.id 或 我想从这两个方面准确地从消息中提取#someuser.name,从url中提取#someuser.id。可能有许多这样的字符串要从url和消息中提取 我的正则表达式当前如下所示: (#[^\.]+?\.)([^\W]\w+\b) 它工作正常,除了一对一的情况,我不知道怎么做-例如: 这些字符串不应匹配:#.id,#.id。在#和之

我试图创建一个正则表达式,以便从字符串中提取一些文本。我想从URL或普通文本消息中提取文本,例如:

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
    可以是除空格以外的任何内容,也不能包含
    #
  • B
    只能是常规ASCII字母或数字
将这些要求转换为(可能的)正则表达式:

你可以用

String regex = "#[^.#]*[^.#\\s][^#.]*\\.\\w+";
见和:

详细信息

  • #
    -一个
    #
    符号
  • [^.#]*
    -除
  • [^.#\\s]
    -除了
    和空白之外的任何字符
  • [^#.]*
    -除
  • \。
    -一个点
  • \w+
    -1+字字符(字母、数字或
    \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:是的,没有明确的要求,很难找到“好的答案”这就是我想要的,谢谢:)