如何匹配正则表达式中的"任何字符"?

Sao*_*obi 272 java regex

以下内容应该匹配:

AAA123
ABCDEFGH123
XXXX123
Run Code Online (Sandbox Code Playgroud)

我可以这样做".*123"吗?

Del*_*ani 595

是的你可以.这应该工作.

  • . =任何炭
  • \. =实际的点字符
  • .?= .{0,1}=匹配任何char零或一次
  • .*= .{0,}=匹配任何char零次或多次
  • .+= .{1,}=匹配任何char一次或多次

  • 并不总是点是指任何字符.单行模式时例外.\ p {all}应该是 (17认同)
  • 如何添加新行? (8认同)
  • @pippilongstocking 反斜杠是 `\\\` (3认同)

Blu*_*eft 53

是的,这将起作用,但请注意,.除非您在编译表达式时传递DOTALL标志,否则将无法匹配换行符:

Pattern pattern = Pattern.compile(".*123", Pattern.DOTALL);
Matcher matcher = pattern.matcher(inputStr);
boolean matchFound = matcher.matches();
Run Code Online (Sandbox Code Playgroud)

  • 这是一些非常有用的信息!我认为`.`会匹配换行符.我很高兴看到你的回答,我需要用它! (11认同)
  • 如果你不能使用DOTALL,@ TheodoreMurdock` [\ s\S]`是一种匹配任何角色的流行方式. (7认同)

thr*_*thr 20

使用模式.匹配任何字符一次,.*以匹配任何字符零次或多次, .+以匹配任何字符一次或多次.

  • 这是唯一可以在 Visual Studio 的查找工具中使用的工具,但它不匹配换行符:( (3认同)

pol*_*nts 11

有许多复杂的正则表达式测试和开发工具,但如果你只想要一个简单的Java测试工具,这里有一个供你玩的:

    String[] tests = {
        "AAA123",
        "ABCDEFGH123",
        "XXXX123",
        "XYZ123ABC",
        "123123",
        "X123",
        "123",
    };
    for (String test : tests) {
        System.out.println(test + " " +test.matches(".+123"));
    }
Run Code Online (Sandbox Code Playgroud)

现在,您可以轻松添加新的测试用例并尝试新的模式.享受探索正则表达式的乐趣.

也可以看看


Huu*_*som 9

不,*将匹配零个或多个字符.您应该使用+,匹配一个或多个.

这个表达式可能更适合您: [A-Z]+123


Emm*_*mma 9

.*并且.+适用于除新行之外的任何字符。

双逃

以防万一,您想包含新行,以下表达式也可能适用于需要双重转义的语言,例如 Java 或 C++:

[\\s\\S]*
[\\d\\D]*
[\\w\\W]*
Run Code Online (Sandbox Code Playgroud)

零次或多次,或

[\\s\\S]+
[\\d\\D]+
[\\w\\W]+
Run Code Online (Sandbox Code Playgroud)

一次或多次。

单转:

某些语言不需要双重转义,例如 C#、PHP、Ruby、PERL、Python、JavaScript:

[\s\S]*
[\d\D]*
[\w\W]*
[\s\S]+
[\d\D]+
[\w\W]+
Run Code Online (Sandbox Code Playgroud)

测试

import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class RegularExpression{

    public static void main(String[] args){

        final String regex_1 = "[\\s\\S]*";
        final String regex_2 = "[\\d\\D]*";
        final String regex_3 = "[\\w\\W]*";
        final String string = "AAA123\n\t"
             + "ABCDEFGH123\n\t"
             + "XXXX123\n\t";

        final Pattern pattern_1 = Pattern.compile(regex_1);
        final Pattern pattern_2 = Pattern.compile(regex_2);
        final Pattern pattern_3 = Pattern.compile(regex_3);

        final Matcher matcher_1 = pattern_1.matcher(string);
        final Matcher matcher_2 = pattern_2.matcher(string);
        final Matcher matcher_3 = pattern_3.matcher(string);

        if (matcher_1.find()) {
            System.out.println("Full Match for Expression 1: " + matcher_1.group(0));
        }

        if (matcher_2.find()) {
            System.out.println("Full Match for Expression 2: " + matcher_2.group(0));
        }
        if (matcher_3.find()) {
            System.out.println("Full Match for Expression 3: " + matcher_3.group(0));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出

Full Match for Expression 1: AAA123
    ABCDEFGH123
    XXXX123

Full Match for Expression 2: AAA123
    ABCDEFGH123
    XXXX123

Full Match for Expression 3: AAA123
    ABCDEFGH123
    XXXX123
Run Code Online (Sandbox Code Playgroud)

如果你想探索这个表达式,它已经在regex101.com 的右上角面板中进行了解释。如果您愿意,您还可以在此链接中观看它如何与某些示例输入匹配。


正则表达式电路

jex.im可视化正则表达式:

在此处输入图片说明


Rav*_*har 6

尝试正则表达式.{3,}。这将匹配除换行符之外的所有字符。


Aka*_*eth 5

示例问题的具体解决方案:-

尝试[A-Z]*123$将匹配123, AAA123, ASDFRRF123。如果您在123使用前至少需要一个字符[A-Z]+123$

问题的一般解决方案(如何匹配正则表达式中的“任何字符”):

  1. 如果您正在寻找包括空格在内的任何内容,您可以尝试[\w|\W]{min_char_to_match,}.
  2. 如果您尝试匹配除空格以外的任何内容,您可以尝试[\S]{min_char_to_match,}.


Jam*_*vis 5

我看到的最常见的编码方式是使用字符类,其成员构成所有可能字符集的分区。

通常人们写为[\s\S](空格或无空格),但是[\w\W][\d\D]等一切都能解决。

  • 作为参考,来自 https://www.regular-expressions.info/dot.html:“JavaScript 和 VBScript 没有选项使点匹配换行符。在这些语言中,您可以使用字符类,例如[\s\S] 匹配任何字符。该字符匹配空白字符(包括换行符)或非空白字符。由于所有字符要么是空白字符,要么是非空白字符,该字符类匹配任何字符。” (2认同)