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

495

应该匹配以下内容:

AAA123
ABCDEFGH123
XXXX123

我能做到吗:".*123"


3
这个链接展示了一种看起来可行的方法 --> [^]+ 它的意思是“不要不匹配任何字符”,这是一种双重否定的表达方式,可以理解为“匹配任何字符”。来源 - https://loune.net/2011/02/match-any-character-including-new-line-in-javascript-regexp/ - JsAndDotNet
13个回答

990

可以的,那应该可行。

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

33
并不总是点号代表任何字符。在单行模式下有例外。\p{all} 应该被使用。 - martian
你如何将反斜杠包含到这个字符列表中? - Dil.
3
反斜杠的英文表示为backslash,在计算机中常用符号是\,中文称为“反斜线”。而题目中提到的“backward slash”实际上指的也是反斜线,在计算机领域里并没有这个专有名称。给定的例子中,反斜线的描写方式是三个连续的反斜杠符号:\\\ - Poutrathor
8
如何插入新行? - GC_
@GC_ 不要包含 .(点)我猜测。 - Fauzan Edris
@GC_ 包括新行 [\s\S]* 对我有效 - mbanchero

68

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

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

11
这是非常有用的信息!我以为 . 会匹配换行符。我很高兴看到你的答案,我需要用到它! - Ben Kane
1
有时候在Java正则表达式中,您可能需要匹配换行符,而不能传递Pattern.DOTALL参数,比如在Eclipse中进行多行正则表达式搜索或使用任何提供正则表达式搜索功能的Java应用程序时。基于regular-expression.info 的指南,您可能需要使用 {.,\n,\r,\u2028,\u2029,\u0085} 来匹配绝对任何字符(这些Unicode字符是额外添加的行终止符,而在Java中点号.并不匹配它们),但对于大多数文本文件,只需使用 {.,\n,\r} 即可。 - Theodore Murdock
12
[\s\S] 是一种常见的匹配任何字符的方法,如果不能使用 DOTALL 的话。 - mpen
如果你想到了,不要使用 (?:.|\\v)*,因为这会引发 JDK-6337993 问题。 - Olivier Cailloux

58

使用模式 . 来匹配任意一个字符(只匹配一次),.* 匹配零个或多个字符,.+ 匹配一个或多个字符。


2
这是唯一在Visual Studio的查找工具中有效的,但它不匹配换行符 :( - MGOwen

35

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

通常人们会写成[\s\S](空白或非空白),尽管 [\w\W][\d\D]等也可以使用。


2
参考自https://www.regular-expressions.info/dot.html:“JavaScript和VBScript没有选项可以使点匹配换行符。在这些语言中,您可以使用字符类(例如[\s\S])来匹配任何字符。此字符匹配空格字符(包括换行符)或非空格字符。由于所有字符都是空格或非空格,因此此字符类匹配任何字符。” - Dean Or
1
点赞这个回答。被采纳的回答并没有回答问题,但是这个回答确实回答了问题。 - PHP Guru

17

.*.+表示除了新行以外的任何字符。

双重转义

如果您需要包含新行,并且使用需要双重转义(如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的右上角面板上找到解释。如果您愿意,您还可以在此链接中查看它如何匹配一些示例输入。


RegEx电路

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

enter image description here


1
这不是已经在这里得到回答了吗?https://dev59.com/W3E85IYBdhLWcg3wKwOE#55149095 - The fourth bird
我喜欢使用 (\W|\w)* 而不是双重转义。 - Sudip Bhattarai
1
真的很有帮助,解释得非常清楚。 - Nagibaba

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

9
不,* 将匹配零个或多个字符。您应该使用 +,它将匹配一个或多个字符。
这个表达式可能更适合您:[A-Z]+123

1
在这里点赞。虽然OP没有具体说明,但是似乎需要指出的是,该模式将匹配任何字符,包括像###123、123123、%$#123这样的字符,而这些可能不是OP想要的。@Huusom使用的字符类将允许OP仅使用大写字母字符,这可能是意图。 - techdude

6

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


5

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

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

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

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

2

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

JavaScript示例:

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

你介意添加一些代码,让我们知道你尝试了什么吗? - Jennis Vaishnav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接