ควรจับคู่ต่อไปนี้:
AAA123
ABCDEFGH123
XXXX123
ฉันสามารถทำได้: ".*123"?
ควรจับคู่ต่อไปนี้:
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]เป็นวิธียอดนิยมในการจับคู่อักขระใด ๆ หากคุณไม่สามารถใช้ DOTALL ได้
ใช้รูปแบบ.เพื่อจับคู่อักขระใด ๆ หนึ่งครั้ง.*เพื่อจับคู่อักขระใด ๆ ที่เป็นศูนย์หรือมากกว่านั้น .+เพื่อจับคู่อักขระใด ๆ หนึ่งครั้งขึ้นไป
มีเครื่องมือทดสอบและพัฒนา regex ที่ซับซ้อนมากมาย แต่ถ้าคุณต้องการใช้ชุดทดสอบอย่างง่ายใน Java ต่อไปนี้เป็นสิ่งที่คุณสามารถเล่นกับ:
String[] tests = {
"AAA123",
"ABCDEFGH123",
"XXXX123",
"XYZ123ABC",
"123123",
"X123",
"123",
};
for (String test : tests) {
System.out.println(test + " " +test.matches(".+123"));
}
ตอนนี้คุณสามารถเพิ่มชุดทดสอบใหม่และลองรูปแบบใหม่ได้อย่างง่ายดาย ขอให้สนุกกับการสำรวจ regex
ไม่*จะจับคู่กับอักขระศูนย์หรือมากกว่า คุณควรใช้+ซึ่งตรงกับหนึ่งหรือมากกว่าแทน
การแสดงออกนี้อาจทำงานได้ดีขึ้นสำหรับคุณ: [A-Z]+123
วิธีที่พบมากที่สุดที่ฉันเคยเห็นในการเข้ารหัสนี้คือคลาสอักขระที่สมาชิกสร้างพาร์ติชันของชุดอักขระที่เป็นไปได้ทั้งหมด
คนมักจะเขียนว่าเป็น[\s\S](ช่องว่างหรือไม่ว่าง) แม้[\w\W], [\d\D]ฯลฯ จะทำงานทั้งหมด
.*และ.+สำหรับตัวอักษรใด ๆ ยกเว้นบรรทัดใหม่
ในกรณีที่คุณต้องการรวมบรรทัดใหม่นิพจน์ต่อไปนี้อาจใช้ได้กับภาษาเหล่านั้นที่จำเป็นต้องใช้การหลบหลีกสองครั้งเช่น Java หรือ C ++:
[\\s\\S]*
[\\d\\D]*
[\\w\\W]*
สำหรับศูนย์หรือมากกว่านั้นหรือ
[\\s\\S]+
[\\d\\D]+
[\\w\\W]+
หนึ่งครั้งขึ้นไป
ไม่จำเป็นต้องใช้การ Escape ซ้ำสองครั้งสำหรับบางภาษาเช่น, 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)*แทนที่จะหลบหนีสองเท่า
วิธีแก้ไขปัญหาเฉพาะสำหรับตัวอย่าง: -
ลอง[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’.
ลอง .{3,}regex สิ่งนี้จะตรงกับตัวละครทั้งหมดยกเว้นบรรทัดใหม่
ฉันทำงานนี้จุดไม่เสมอหมายถึงอักขระใด ๆ ข้อยกเว้นเมื่อโหมดบรรทัดเดียว \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");
}