Java 字符串上的Regex replaceAll

Java 字符串上的Regex replaceAll,java,regex,Java,Regex,假设我有一个字符串: asdf/dfa/fds?adsf 我希望能够得到字符串:asdf?adsf 所以本质上我想解析出从第一个“/”到“?”的所有内容 我尝试过使用它(见下面的示例),但无法让它工作: s = s.replaceAll("\\/([?]*)", ""); 试试这个 String s = "asdf/dfa/fds?adsf".replaceAll("/.*(?=\\?)", ""); 试试这个 String s = "asdf/dfa/fds?adsf".replaceAl

假设我有一个字符串:

asdf/dfa/fds?adsf

我希望能够得到字符串:asdf?adsf

所以本质上我想解析出从第一个“/”到“?”的所有内容

我尝试过使用它(见下面的示例),但无法让它工作:

s = s.replaceAll("\\/([?]*)", "");
试试这个

String s = "asdf/dfa/fds?adsf".replaceAll("/.*(?=\\?)", "");
试试这个

String s = "asdf/dfa/fds?adsf".replaceAll("/.*(?=\\?)", "");

这应该能奏效

replaceAll("/[^?]*", "")

/[^?]*
将首先匹配
/
,然后匹配所有
非-?
字符。

这应该可以解决问题

replaceAll("/[^?]*", "")

/[^?]*
将首先匹配
/
,然后匹配所有
非-?
字符。

您应该将其更改为:

s = s.replaceAll("/.*(?=\\?)", "");
(?=\\?)
是一种前瞻,意思是“下一个字符是文字
”。(仅供参考,
在正则表达式中具有特殊含义。)


但是,您没有提到如果存在多个
,会发生什么情况。上面的正则表达式将匹配到最后一个

如果你想比赛到第一场

s = s.replaceAll("/.*?(?=\\?)", "");

额外的
会导致重复匹配“不情愿”。

您应该将其更改为:

s = s.replaceAll("/.*(?=\\?)", "");
(?=\\?)
是一种前瞻,意思是“下一个字符是文字
”。(仅供参考,
在正则表达式中具有特殊含义。)


但是,您没有提到如果存在多个
,会发生什么情况。上面的正则表达式将匹配到最后一个

如果你想比赛到第一场

s = s.replaceAll("/.*?(?=\\?)", "");

额外的
会导致重复匹配“不情愿”。

谢谢您的解释。@user1413969没问题:)谢谢您的解释。@user1413969没问题:)您不需要逃避
/
,所以在
/
之前不需要
\
。此外,OP输入似乎是链接,因此其中不会有第二个
,但我喜欢你在回答中包含这种可能性的方式:)@Pshemo:“似乎”。我想是吧?你不需要逃避
/
,所以在
/
之前不需要
\
。此外,OP输入似乎是链接,因此其中不会有第二个
,但我喜欢你在回答中包含这种可能性的方式:)@Pshemo:“似乎”。我想是吧?