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


304

以下内容应匹配:

AAA123
ABCDEFGH123
XXXX123

我该怎么办".*123"


2
该链接显示了一种似乎可行的方法-> [^] +,表示“不匹配任何字符”,这是一个双重否定符号,可以重新读作“匹配任何字符”。来源- loune.net/2011/02/...
HockeyJ

Answers:


643

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

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

22
并非总是点代表任何字符。单行模式时例外。\ p {all}应该是
火星

您如何在该字符列表中包含反斜杠?
搜索结果网络结果

1
@pippilongstocking反斜杠是“ \\”
Poutrathor,

58

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

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

11
那是一些非常有用的信息!我以为.会换行。很高兴阅读您的回答,我需要使用它!
本·凯恩2013年

在无法传递Pattern.DOTALL的情况下,例如在Eclipse中进行多行正则表达式搜索时,或者以任何提供正则表达式搜索的Java应用程序的用户身份使用时,有时您可能还需要在Java正则表达式中匹配换行符。根据regular-expression.info的指南,您可能需要使用{.,\n,\r,\u2028,\u2029,\u0085}来完全匹配任何字符(Unicode字符是.在Java中不匹配的附加行终止字符),但仅{.,\n,\r}适用于大多数文本文件。
西奥多·默多克

8
[\s\S]如果您无法使用DOTALL,@ TheodoreMurdock 是匹配任何字符的一种流行方法。
mpen

在情况下,它会来到你的头脑,不要使用(?:.|\\v)*,因为,JDK-6337993
奥利维尔·卡柳克斯

22

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


11

有很多复杂的正则表达式测试和开发工具,但是如果您只想使用Java中的简单测试工具,可以使用以下工具:

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

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

也可以看看


1
只为regular-expressions.info链接投票。一个学习正则表达式和参考的好网站。
Freiheit,2010年

9

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

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


1
在这里投票。OP没有指定,但似乎可以正确地添加该模式以匹配任何字符,例如OP可能不需要的任何字符,例如### 123、123123,%$#123。上面使用的字符类@Huusom将使所有OP仅使用大写字母字符,这可能是本意。
techdude

9

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

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


2
作为参考,来自regular-expressions.info/dot.html:“ JavaScript和VBScript没有使点匹配换行符的选项。在这些语言中,可以使用诸如[\ s \ S]之类的字符类。可以匹配任何字符。此字符匹配的字符可以是空格字符(包括换行符),也可以不是非空格字符。由于所有字符都是空格或非空格,因此此字符类可以匹配任何字符”。
院长或

7

.*并且.+用于除换行符以外的任何字符。

双重转义

为了以防万一,您可能想添加换行,对于那些需要双重转义的语言,例如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可视化正则表达式:

在此处输入图片说明


1
这里不是已经回答了吗?stackoverflow.com/a/55149095/5424988
第四只鸟

我喜欢(\W|\w)*而不是两次逃避
Sudip Bhattarai

1
很有帮助的解释
Nagibaba

5

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

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

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

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

2

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

JavaScript示例:

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

您介意添加一些代码以使我们知道您尝试了什么吗?
詹妮斯·瓦什纳夫(Jennis Vaishnav)


-4

我的工作方式并非总是点代表任何字符。单行模式时例外。\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");
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.