Java Regex查找以开头和结尾的所有可能出现的文本~
我想查找包含在两个Java Regex查找以开头和结尾的所有可能出现的文本~,java,regex,Java,Regex,我想查找包含在两个~之间的所有可能出现的文本 例如:对于文本~*\u abc~xyz~~123~,我希望以下表达式作为匹配模式: ~*\u abc~ ~xyz~ ~123~ 注意,它可以是字母或数字 我尝试使用regex~[\w]+?~,但它没有给我~xyz~。我想重新考虑~。但我不希望只将~作为可能的匹配项。与以下正则表达式一起使用: 有时,您需要在同一个单词中找到几个匹配项。例如,假设要从字符串中提取ABCD、BCD、CD和D。您可以使用以下单个正则表达式执行此操作: (?=(\w+) 在字
~
之间的所有可能出现的文本
例如:对于文本~*\u abc~xyz~~123~
,我希望以下表达式作为匹配模式:
~*\u abc~
~xyz~
~123~
注意,它可以是字母或数字 我尝试使用regex
~[\w]+?~
,但它没有给我~xyz~
。我想重新考虑~
。但我不希望只将~
作为可能的匹配项。与以下正则表达式一起使用:
有时,您需要在同一个单词中找到几个匹配项。例如,假设要从字符串中提取ABCD
、BCD
、CD
和D
。您可以使用以下单个正则表达式执行此操作:
(?=(\w+)
在字符串的第一个位置(在A
之前),引擎启动第一次匹配尝试。前瞻断言紧跟在当前位置之后的是一个或多个单词字符,并将这些字符捕获到组1。前瞻成功,匹配尝试也成功。由于模式与任何实际字符都不匹配(前瞻只会查找),因此引擎返回零宽度匹配(空字符串)。它还返回组1捕获的内容:ABCD
然后,引擎移动到字符串中的下一个位置,并开始下一次匹配尝试。同样,前瞻断言紧跟在该位置后面的是单词字符,并将这些字符捕获到组1。匹配成功,组1包含BCD
引擎移动到字符串中的下一个位置,该过程在CD
中重复,然后在D
中重复
所以,使用
(?=(~[^\s~]+~))
见
模式(?=(~[^\s~]+~)
检查字符串中的每个位置,并搜索~
,后跟除空格和~
以外的1+字符,然后再后跟另一个~
。由于索引仅在检查位置后移动,而不是在捕获值时移动,因此会提取重叠的子字符串
:
试试这个
[^~\s]*
此模式不考虑字符<代码> ~和空间(引用为<代码> )。< /P>
我已经测试过了,它可以在你的字符串上工作,下面是。
(?=(~.*?~)
#重叠匹配#lookaheadI使用rubular[.]com进行验证。似乎您的正则表达式没有拾取第一个~*abc~。@AbhishekAsh您的要求和示例字符串/输出不在正则表达式中sync@WiktorStribiżew:你能解释一下吗?它是如何不同步的。我会继续纠正它。“它可以是字母表或数字”,但*.
既不是字母表也不是数字…你的答案总是让人惊讶me@WiktorStribiżew:谢谢你的回答。在这件事上撞了我好一阵子。符合我的要求。
String text = " ~*_abc~xyz~ ~123~";
Pattern p = Pattern.compile("(?=(~[^\\s~]+~))");
Matcher m = p.matcher(text);
List<String> res = new ArrayList<>();
while(m.find()) {
res.add(m.group(1));
}
System.out.println(res); // => [~*_abc~, ~xyz~, ~123~]
import re
p = re.compile(r'(?=(~[^\s~]+~))')
test_str = " ~*_abc~xyz~ ~123~"
print(p.findall(test_str))
# => ['~*_abc~', '~xyz~', '~123~']