使用正则表达式在java中提取子字符串

使用正则表达式在java中提取子字符串,java,regex,Java,Regex,我需要从字符串中提取“URPlus1\u S2\u 3”: "Last one: http://abc.imp/Basic2#URPlus1_S2_3," 在Java语言中使用正则表达式 有人能帮我吗?我是第一次使用正则表达式。您还没有真正定义查找该字符串所需的标准,但这里有一种基于“#”分隔符的方法。您可以根据需要调整正则表达式 expr: .*#([^,]*) extract: \1 请转到此处获取语法文档: 试试看 Pattern p = Pattern.compile("#([^,

我需要从字符串中提取
“URPlus1\u S2\u 3”

"Last one: http://abc.imp/Basic2#URPlus1_S2_3," 
在Java语言中使用正则表达式


有人能帮我吗?我是第一次使用正则表达式。

您还没有真正定义查找该字符串所需的标准,但这里有一种基于“#”分隔符的方法。您可以根据需要调整正则表达式

expr: .*#([^,]*)
extract: \1
请转到此处获取语法文档:

试试看

Pattern p = Pattern.compile("#([^,]*)");
Matcher m = p.matcher(myString);
if (m.find()) {
  doSomethingWith(m.group(1));  // The matched substring
}

如果没有“#”,则上面返回完整字符串。有更好的方法使用正则表达式,但最好的解决方案是不使用正则表达式。有URL和URI类做这项工作。

因为这是您第一次使用正则表达式,我建议您换一种方式,现在更容易理解(直到您掌握正则表达式;),并且如果您需要:

String yourPart = new String().split("#")[1];
这里有一个长的版本:

String url = "http://abc.imp/Basic2#URPlus1_S2_3,";
String anchor = null;
String ps = "#(.+),";
Pattern p = Pattern.compile(ps);
Matcher m = p.matcher(url);
if (m.matches()) {
    anchor = m.group(1);
}

要理解的要点是括号的使用,括号用于创建可以从模式中提取的组。在
Matcher
对象中,
group
方法将按从索引1开始的顺序返回它们,而完全匹配则由索引0返回。

如果您只需要
#
之后的所有内容,请使用拆分:

String s = "Last one: http://abc.imp/Basic2#URPlus1_S2_3," ;
System.out.println(s.split("#")[1]);
或者,如果要解析URI并获取片段组件,可以执行以下操作:

URI u = new URI("http://abc.imp/Basic2#URPlus1_S2_3,");
System.out.println(u.getFragment());

您必须学会如何指定您的需求;)

请添加更多的条件,如果您只需要提取该字符串,那么您最好复制它。你的标准是你必须找到“#”和“,”之间的部分吗?“#”和“,”之间的提取对我来说似乎是最合乎逻辑的方法。你没有找到尾随的逗号。这也匹配了他不希望匹配的逗号,如果哈希和逗号之间有换行符,则不会匹配。不包括那些没有指定的。事实上,关于逗号。修正。这无法得到我需要的答案。我认为字符串ps不正确。好吧,应该是!我使用的是Clojure,但这种语言直接使用Java的正则表达式引擎:
(第二个(重新查找“)”(.+),“最后一个:http://abc.imp/Basic2#URPlus1_S2_3“,”)
结果为“URPlus1\u S2\u 3”。
URI u = new URI("http://abc.imp/Basic2#URPlus1_S2_3,");
System.out.println(u.getFragment());
String s = "Last one: http://abc.imp/Basic2#URPlus1_S2_3,";
Matcher m = Pattern.compile("(URPlus1_S2_3)").matcher(s);
if (m.find()) System.out.println(m.group(1));