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

时间:2016-03-31 10:44:11

标签: java regex

我想在两个~之间找到所有可能出现的文字。

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

  1. ~*_abc~
  2. ~xyz~
  3. ~123~
  4. 注意它可以是字母或数字。

    我尝试使用正则表达式~[\w]+?~,但它没有给我~xyz~。我希望重新考虑~。但我不希望仅~~作为可能的匹配。

2 个答案:

答案 0 :(得分:5)

capturing inside a positive lookahead与以下正则表达式一起使用:

  

有时,您需要在同一个单词中进行多次匹配。例如,假设您要从ABCD这样的字符串中提取ABCDBCDCDD。你可以用这个单一的正则表达式来实现:

     

(?=(\w+))

     

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

     

然后引擎移动到字符串中的下一个位置并开始下一个匹配尝试。同样,前瞻断言紧接在该位置之后的是单词字符,并将这些字符捕获到组1.匹配成功,组1包含BCD

     

引擎移动到字符串中的下一个位置,然后CD然后D重复该过程。

所以,使用

(?=(~[^\s~]+~))

请参阅regex demo

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

Python demo

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

答案 1 :(得分:-1)

试试这个[^~\s]*

此模式不考虑字符~和空格(称为\s)。

我测试了它,它适用于你的字符串,这里the demo