应该匹配以下内容:
AAA123
ABCDEFGH123
XXXX123
我能做到吗:".*123"
?
应该匹配以下内容:
AAA123
ABCDEFGH123
XXXX123
我能做到吗:".*123"
?
可以的,那应该可行。
.
= 匹配除换行符之外的任何字符\.
= 实际的点字符.?
= .{0,1}
= 匹配除换行符之外的任何字符零次或一次.*
= .{0,}
= 匹配除换行符之外的任何字符零次或多次.+
= .{1,}
= 匹配除换行符之外的任何字符一次或多次backslash
,在计算机中常用符号是\
,中文称为“反斜线”。而题目中提到的“backward slash”实际上指的也是反斜线,在计算机领域里并没有这个专有名称。给定的例子中,反斜线的描写方式是三个连续的反斜杠符号:\\\
。 - Poutrathor.
(点)我猜测。 - Fauzan Edris是的,那样会起作用,不过请注意,.
将不会匹配换行符,除非在编译表达式时传递 DOTALL 标志:
Pattern pattern = Pattern.compile(".*123", Pattern.DOTALL);
Matcher matcher = pattern.matcher(inputStr);
boolean matchFound = matcher.matches();
.
会匹配换行符。我很高兴看到你的答案,我需要用到它! - Ben Kane{.,\n,\r,\u2028,\u2029,\u0085}
来匹配绝对任何字符(这些Unicode字符是额外添加的行终止符,而在Java中点号.
并不匹配它们),但对于大多数文本文件,只需使用 {.,\n,\r}
即可。 - Theodore Murdock[\s\S]
是一种常见的匹配任何字符的方法,如果不能使用 DOTALL 的话。 - mpen使用模式 .
来匹配任意一个字符(只匹配一次),.*
匹配零个或多个字符,.+
匹配一个或多个字符。
我最常见到的编码方式是使用一个字符类,其成员形成了所有可能字符集的一个划分。
通常人们会写成[\s\S]
(空白或非空白),尽管 [\w\W]
,[\d\D]
等也可以使用。
.*
和.+
表示除了新行以外的任何字符。
如果您需要包含新行,并且使用需要双重转义(如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可视化正则表达式:
(\W|\w)*
而不是双重转义。 - Sudip Bhattarai有很多复杂的正则表达式测试和开发工具,但如果你只想在Java中使用简单的测试工具,这里有一个可以供你使用:
String[] tests = {
"AAA123",
"ABCDEFGH123",
"XXXX123",
"XYZ123ABC",
"123123",
"X123",
"123",
};
for (String test : tests) {
System.out.println(test + " " +test.matches(".+123"));
}
现在,您可以轻松地添加新测试用例并尝试新的模式。享受正则表达式探索的乐趣。
*
将匹配零个或多个字符。您应该使用 +
,它将匹配一个或多个字符。[A-Z]+123
。尝试使用正则表达式 .{3,}
。这将匹配除换行符以外的所有字符。
针对示例问题的具体解决方案:
尝试使用 [A-Z]*123$
进行匹配,将匹配到 123
、AAA123
、ASDFRRF123
。如果您需要在 123
前至少有一个字符,请使用 [A-Z]+123$
。
针对问题的通用解决方案(如何在正则表达式中匹配“任何字符”):
[\w|\W]{min_char_to_match,}
。[\S]{min_char_to_match,}
。[^]
应该匹配任何字符,包括换行符。 [^
CHARS]
匹配除CHARS中的所有字符外的所有字符。如果CHARS为空,则匹配所有字符。
JavaScript示例:
/a[^]*Z/.test("abcxyz \0\r\n\t012789ABCXYZ") // Returns ‘true’.