【发布时间】:2011-02-24 04:02:47
【问题描述】:
以下应匹配:
AAA123
ABCDEFGH123
XXXX123
我可以:".*123" 吗?
【问题讨论】:
-
此链接显示了一种似乎有效的方法 --> [^]+ 意思是“不匹配任何字符”,可以重新读为“匹配任何字符”的双重否定。来源 - loune.net/2011/02/…
以下应匹配:
AAA123
ABCDEFGH123
XXXX123
我可以:".*123" 吗?
【问题讨论】:
是的,你可以。应该可以的。
. = 除换行符以外的任何字符\. = 实际的点字符.? = .{0,1} = 匹配除换行符以外的任何字符零次或一次.* = .{0,} = 匹配除换行符以外的任何字符零次或多次.+ = .{1,} = 匹配除换行符以外的任何字符一次或多次【讨论】:
可以,但请注意 . 不会匹配换行符,除非您在编译表达式时传递 DOTALL 标志:
Pattern pattern = Pattern.compile(".*123", Pattern.DOTALL);
Matcher matcher = pattern.matcher(inputStr);
boolean matchFound = matcher.matches();
【讨论】:
. 会匹配换行符。很高兴看到您的回答,我需要使用它!
{.,\n,\r,\u2028,\u2029,\u0085} 来完全匹配任何字符(Unicode 字符是添加的附加行终止字符,在Java 中与. 不匹配),但只有{.,\n,\r} 适用于大多数文本文件。
[\s\S] 是匹配任何字符的流行方式。
(?:.|\\v)*,因为JDK-6337993。
使用模式. 匹配任何字符一次,.* 匹配任何字符零次或多次,.+ 匹配任何字符一次或多次。
【讨论】:
我见过的最常见的编码方式是使用字符类,其成员构成所有可能字符集的分区。
通常人们将其写为[\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 的右上方面板中已对此进行了说明。如果您愿意,您还可以在this link 中观看它如何与一些示例输入相匹配。
jex.im 可视化正则表达式:
【讨论】:
(\W|\w)* 而不是双重转义
有很多复杂的正则表达式测试和开发工具,但如果您只想要一个简单的 Java 测试工具,这里有一个供您使用:
String[] tests = {
"AAA123",
"ABCDEFGH123",
"XXXX123",
"XYZ123ABC",
"123123",
"X123",
"123",
};
for (String test : tests) {
System.out.println(test + " " +test.matches(".+123"));
}
现在您可以轻松添加新测试用例并尝试新模式。享受探索正则表达式的乐趣。
【讨论】:
不,* 将匹配零个或多个字符。您应该使用+,它匹配一个或多个。
这个表达式可能更适合你:[A-Z]+123
【讨论】:
示例问题的具体解决方案:-
尝试[A-Z]*123$ 将匹配123、AAA123、ASDFRRF123。如果您在123 之前至少需要一个字符,请使用[A-Z]+123$。
问题的一般解决方案(如何匹配正则表达式中的“任意字符”):
[\w|\W]{min_char_to_match,}。[\S]{min_char_to_match,}。【讨论】:
试试正则表达式.{3,}。这将匹配除新行之外的所有字符。
【讨论】:
[^] 应该匹配任何字符,包括换行符。 [^CHARS] 匹配除 CHARS 中的字符之外的所有字符。如果 CHARS 为空,则匹配所有字符。
JavaScript 示例:
/a[^]*Z/.test("abcxyz \0\r\n\t012789ABCXYZ") // Returns ‘true’.
【讨论】:
我工作这个 点并不总是意味着任何字符。单行模式时例外。 \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");
}
【讨论】: