【问题标题】:How to match "any character" in regular expression?如何匹配正则表达式中的“任何字符”?
【发布时间】:2011-02-24 04:02:47
【问题描述】:

以下应匹配:

AAA123
ABCDEFGH123
XXXX123

我可以:".*123" 吗?

【问题讨论】:

  • 此链接显示了一种似乎有效的方法 --> [^]+ 意思是“不匹配任何字符”,可以重新读为“匹配任何字符”的双重否定。来源 - loune.net/2011/02/…

标签: java regex


【解决方案1】:

是的,你可以。应该可以的。

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

【讨论】:

  • 点并不总是意味着任何字符。单行模式时例外。 \p{all} 应该是
  • 如何在这个字符列表中包含反斜杠?
  • @pippilongstocking 反斜杠是`\\`
  • 如何添加新行?
【解决方案2】:

可以,但请注意 . 不会匹配换行符,除非您在编译表达式时传递 DOTALL 标志:

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

【讨论】:

  • 这是一些非常有用的信息!我假设. 会匹配换行符。很高兴看到您的回答,我需要使用它!
  • 您有时可能还需要在无法传递 Pattern.DOTALL 的上下文中匹配 Java 正则表达式中的换行符,例如在 Eclipse 中进行多行正则表达式搜索时,或作为任何 Java 应用程序的用户提供正则表达式搜索。基于regular-expression.info's guide,您可能需要使用{.,\n,\r,\u2028,\u2029,\u0085} 来完全匹配任何字符(Unicode 字符是添加的附加行终止字符,在Java 中与. 不匹配),但只有{.,\n,\r} 适用于大多数文本文件。
  • 如果您不能使用 DOTALL,@TheodoreMurdock [\s\S] 是匹配任何字符的流行方式。
  • 如果你想到它,不要使用(?:.|\\v)*,因为JDK-6337993
【解决方案3】:

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

【讨论】:

  • 这是唯一可以在 Visual Studio 的 Find 工具中使用的工具,但它与换行符不匹配 :(
【解决方案4】:

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

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

【讨论】:

  • 供参考,来自regular-expressions.info/dot.html:“JavaScript 和 VBScript 没有使点匹配换行符的选项。在这些语言中,您可以使用字符类,例如 [\s\ S] 匹配任何字符。此字符匹配一个字符,该字符要么是空白字符(包括换行符),要么不是空白字符。由于所有字符都是空白或非空白字符,因此此字符类匹配任何字符。”
  • 投票赞成这个答案。接受的答案没有回答问题,但确实如此。
【解决方案5】:

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

双重转义

以防万一,您想包含新行,以下表达式也可能适用于需要双重转义的那些语言,例如 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 的右上方面板中已对此进行了说明。如果您愿意,您还可以在this link 中观看它如何与一些示例输入相匹配。


正则表达式电路

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

【讨论】:

【解决方案6】:

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

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

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

另见

【讨论】:

  • 只为regular-expressions.info 链接投票。学习正则表达式和参考的好网站。
【解决方案7】:

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

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

【讨论】:

  • 在这里点赞。 OP 没有指定,但添加模式将匹配任何字符似乎是正确的,包括 OP 可能不想要的 ###123、123123、%$#123 之类的内容。 @Huusom 上面使用的字符类将使所有 OP 仅使用可能是本意的大写字母字符。
【解决方案8】:

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

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

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

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

【讨论】:

    【解决方案9】:

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

    【讨论】:

      【解决方案10】:

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

      JavaScript 示例:

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

      【讨论】:

      • 您介意添加一些代码让我们知道您尝试了什么吗?
      【解决方案11】:

      我工作这个 点并不总是意味着任何字符。单行模式时例外。 \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");
      }
      

      【讨论】:

      • 我不明白这个答案有什么问题(除了非常糟糕的英语)。实际上,这是对“任何字符”问题最相关的答案,它对我的​​问题有最大的帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-22
      • 2013-08-02
      • 1970-01-01
      • 2013-04-19
      相关资源
      最近更新 更多