如何使用正则表达式查找特定数字之后出现的所有模式?

问题描述 投票:0回答:3

我有一根绳子:

1aa[appleax]bb[appley]

我想通过正则表达式捕获

applex
appley
,如果还有更多 - 我也想捕获它们。我想要括号里的文字。

这里有一个问题:只有当它们追随

1
时我才想捕获它们。如果他们先去
1
- 我不感兴趣。

我已经尝试过这两种方法(如下),但它们要么给我

applex
,要么给我
appley
(贪婪/懒惰)。但我想要全部。有人知道我可以用什么吗?

我尝试过的方法:

  • 仅捕获
    applex
    1.*?\[(\w*)\]
  • 仅捕获
    appley
    1.*\[(\w*)\]
java regex findall
3个回答
1
投票

您需要使用量词进行积极的回顾。使用 Java,您可以在任何 Java > 8 上使用此功能。

(?<=1.*\[)\w+(?=\])

说明:演示

  • (?<=1.*\[)
    :正向后查找,检查前面的字符是否包含 1 后跟任何内容,然后以
    [
    结尾。既然你对空格不感兴趣, .* 就足够了。但如果您想忽略空格,则可以在正则表达式中将
    (?<=1.*\[)
    替换为
    (?<=1\S*\[)
  • \w+
    :这是你想要的词
  • (?=\])
    :这确认您的单词包含在这个
    ]
    中。这里
    ?=
    确保正向前瞻。

示例 Java 代码:(run)

final String regex = "(?<=1.*\\[)\\w+(?=\\])";    
final String string = "I have a string line: 1aa[appleax]bb[appley]\n\n"
     
 
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);
 
        while (matcher.find()) {
            System.out.println("Full match: " + matcher.group(0));
 
            for (int i = 1; i <= matcher.groupCount(); i++) {
                System.out.println("Group " + i + ": " + matcher.group(i));
            }
        }

-1
投票

为了实现捕获字符串中数字 1 之后的括号之间的所有单词的预期结果,您可以在正则表达式中使用正向先行断言。此断言确保正则表达式引擎仅在后面跟有另一个模式时才匹配该模式。以下是修改正则表达式模式的方法:

1(?=.*?\[(\w*)\])\w*\[([^\]]+)\]

说明:

  • 1 匹配数字 1。
  • (?=.?[(\w)]) 是一个正向先行断言,确保数字 1 之后有一个括号内的单词。它不消耗任何字符,但检查前面是否存在指定的模式。
  • \w* 匹配括号之前的任何单词字符。
  • [ 与左括号匹配。
  • ([^]]+) 捕获括号内的单词。 [^ ]] 匹配任何不是右括号的字符,+ 确保捕获一个或多个字符。
  • ] 匹配右括号。

此模式将成功捕获字符串中数字 1 之后的括号之间的所有单词。


-1
投票

这是一个适用于任何 Java 版本的正则表达式模式:

String s = "1aa[appleax]bb[appley]";
Pattern pattern = Pattern.compile("(?:\\G(?!^)|1)[a-z]*\\[([^\\]\\[]*)]");
Matcher matcher = pattern.matcher(s);
while (matcher.find()){
    System.out.println(matcher.group(1)); // => appleax appley
} 

请参阅 Java 演示。请参阅 正则表达式演示

详情

  • (?:\G(?!^)|1)
    - 匹配
    1
    或前一个成功匹配的结尾
  • [a-z]*
    - 零个或多个小写 ASCII 字母
  • \[
    - 一个
    [
    字符
  • ([^\]\[]*)
    - 第 1 组:除
    [
    ]
  • 之外的任何零个或多个字符
  • ]
    - 一个
    ]
    字符。

注意:我假设

1
和括号之间只有ASCII小写字母。如果除了括号和空格之外还有任何内容,请将
[a-z]*
替换为
[^\[\]\s]*
(代码中的
[^\\[\\]\\s]*
)。

© www.soinside.com 2019 - 2024. All rights reserved.