正则表达式查找以〜开头和结尾的所有可能出现的文本

Abh*_*Ash 5 java regex

我想找到两个~s 之间包含的所有可能出现的文本.

例如:对于文本~*_abc~xyz~ ~123~,我希望以下表达式作为匹配模式:

  1. ~*_abc~
  2. ~xyz~
  3. ~123~

注意它可以是字母或数字.

我尝试使用正则表达式,~[\w]+?~但它没有给我~xyz~.我想~重新考虑一下.但我不想只是~~一场可能的比赛.

Wik*_*żew 5

使用以下正则表达式在正向前瞻中使用捕获:

有时,您需要在同一个单词中进行多次匹配.举例来说,假设从一个字符串,如ABCD要提取ABCD,BCD,CDD.你可以用这个正则表达式做到这一点:

(?=(\w+))

在字符串中的第一个位置(在此之前A),引擎启动第一次匹配尝试.前瞻断言紧接在当前位置之后的是一个或多个单词字符,并将这些字符捕获到组1.前瞻成功,匹配尝试也是如此.由于模式不匹配任何实际字符(前瞻仅查看),引擎返回零宽度匹配(空字符串).它还返回第1组捕获的内容:ABCD

然后引擎移动到字符串中的下一个位置并开始下一个匹配尝试.此外,先行断言什么紧跟这一立场是单词字符,并捕捉这些字符为1组匹配成功,以及1组包含BCD.

发动机移动到字符串中的下一位置,并且重复该过程本身CD然后D.

所以,使用

(?=(~[^\s~]+~))
Run Code Online (Sandbox Code Playgroud)

请参阅正则表达式演示

模式(?=(~[^\s~]+~))检查字符串中的每个位置,~然后搜索除了空白之外的1+个字符~,然后跟随另一个字符~.由于仅在检查位置后移动索引,而不是在捕获值时移动索引,因此将提取重叠的子串.

Python演示:

import re
p = re.compile(r'(?=(~[^\s~]+~))')
test_str = " ~*_abc~xyz~ ~123~"
print(p.findall(test_str))
# => ['~*_abc~', '~xyz~', '~123~']
Run Code Online (Sandbox Code Playgroud)