我想找到两个之间所有可能出现的文本~
s.
例如:对于文本~*_abc~xyz~ ~123~
,我想要以下表达式作为匹配模式:
~*_abc~
~xyz~
~123~
请注意,它可以是字母或数字。
我尝试使用正则表达式~[\w]+?~
但它没有给我~xyz~
。我想~
有待重新考虑。但我不想只是~~
作为可能的匹配。
Use 捕捉积极的前瞻使用以下正则表达式:
有时,您需要在同一个单词内进行多个匹配。例如,假设来自一个字符串,例如ABCD
你想要提取ABCD
, BCD
, CD
and D
。您可以使用这个正则表达式来做到这一点:
(?=(\w+))
在字符串的第一个位置(在A
),引擎开始第一次匹配尝试。前瞻断言紧随当前位置的是一个或多个单词字符,并将这些字符捕获到组 1。前瞻成功,匹配尝试也成功。由于模式与任何实际字符不匹配(先行仅查找),因此引擎返回零宽度匹配(空字符串)。它还返回第 1 组捕获的内容:ABCD
然后引擎移动到字符串中的下一个位置并开始下一次匹配尝试。同样,前瞻断言紧随该位置的是单词字符,并将这些字符捕获到组 1。匹配成功,组 1 包含BCD
.
引擎移动到字符串中的下一个位置,并且该过程会重复进行CD
then D
.
So, use
(?=(~[^\s~]+~))
See the 正则表达式演示
图案(?=(~[^\s~]+~))
检查字符串中的每个位置并搜索~
后跟 1+ 个除空格之外的字符~
然后是另一个~
。由于索引仅在检查位置后移动,而不是在值被移动时移动。captured,重叠的子串被提取。
Java演示:
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~]
以防万一有人需要Python演示:
import re
p = re.compile(r'(?=(~[^\s~]+~))')
test_str = " ~*_abc~xyz~ ~123~"
print(p.findall(test_str))
# => ['~*_abc~', '~xyz~', '~123~']
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)