繁体   English   中英

如何匹配正则表达式中的“任意字符”?

[英]How to match "any character" in regular expression?

应匹配以下内容:

AAA123
ABCDEFGH123
XXXX123

我可以做: ".*123"吗?

是的你可以。 那应该工作。

  • . = 除换行符以外的任何字符
  • \\. = 实际的点字符
  • .? = .{0,1} = 匹配除换行符零或一次以外的任何字符
  • .* = .{0,} = 匹配除换行符零次或多次以外的任何字符
  • .+ = .{1,} = 匹配除换行符以外的任何字符一次或多次

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

Pattern pattern = Pattern.compile(".*123", Pattern.DOTALL);
Matcher matcher = pattern.matcher(inputStr);
boolean matchFound = matcher.matches();

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

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

通常人们将其写为[\\s\\S] (空格或非空格),尽管[\\w\\W][\\d\\D]等都可以。

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

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

现在您可以轻松添加新测试用例并尝试新模式。 玩得开心探索正则表达式。

也可以看看

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

双逃

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

[\\s\\S]*
[\\d\\D]*
[\\w\\W]*

零次或多次,或

[\\s\\S]+
[\\d\\D]+
[\\w\\W]+

一次或多次。

单转:

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

[\s\S]*
[\d\D]*
[\w\W]*
[\s\S]+
[\d\D]+
[\w\W]+

测试

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));
        }
    }
}

输出

Full Match for Expression 1: AAA123
    ABCDEFGH123
    XXXX123

Full Match for Expression 2: AAA123
    ABCDEFGH123
    XXXX123

Full Match for Expression 3: AAA123
    ABCDEFGH123
    XXXX123

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


正则表达式电路

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

在此处输入图片说明

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

这个表达可能更适合你: [AZ]+123

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

尝试[AZ]*123$将匹配123AAA123ASDFRRF123 如果您在123之前至少需要一个字符,请使用[AZ]+123$

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

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

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

[^]应该匹配任何字符,包括换行符。 [^煤焦]匹配除了那些在煤焦中的所有字符。 如果CHARS为空,则匹配所有字符。

JavaScript 示例:

/a[^]*Z/.test("abcxyz \0\r\n\t012789ABCXYZ") // Returns ‘true’.

我喜欢以下内容:

[!-~]

这匹配所有字符代码,包括特殊字符和正常的 AZ、az、0-9

https://www.w3schools.com/charsets/ref_html_ascii.asp

例如faker.inte.net.password(20, false, /[!-~]/)

会生成这样的密码: 0+>8*nZ\\*-mB7Ybbx,b>

一个对我有帮助的人,以防万一您有兴趣检查任何字符

[^]+

我的工作并不总是点是任何字符。 单行模式时例外。 \\p{all}应该是

String value = "|°¬<>!\"#$%&/()=?'\\¡¿/*-+_@[]^^{}";
String expression = "[a-zA-Z0-9\\p{all}]{0,50}";
if(value.matches(expression)){
    System.out.println("true");
} else {
    System.out.println("false");
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM