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

应匹配以下内容:

AAA123
ABCDEFGH123
XXXX123

我能做:".*123" ?

1295637 次浏览

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

是的,你可以。这应该有用。

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

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

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

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

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

现在您可以轻松地添加新的测试用例并尝试新的模式。祝你探索正则表达式愉快。

另请参阅

是的,这可以工作,但请注意,.将不匹配换行符,除非你在编译表达式时传递DOTALL标志:

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

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

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

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

问题的通解(如何匹配正则表达式中的“任意字符”):

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

我不总是用。is表示任意字符。单线模式时异常。\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");
}

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

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

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

JavaScript的例子:

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

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

双逃离

以防万一,你想要包含新的行,下面的表达式可能也适用于那些需要双转义的语言,如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

我喜欢以下几点:

[!-~]

它匹配所有字符代码,包括特殊字符和正常的A-Z, A-Z, 0-9

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

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

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