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~']