ฉันต้องการให้มีการแสดงออกปกติที่ตรวจสอบว่าสตริงมีเพียงตัวอักษรบนและตัวพิมพ์เล็กตัวเลขและขีดล่าง
ฉันต้องการให้มีการแสดงออกปกติที่ตรวจสอบว่าสตริงมีเพียงตัวอักษรบนและตัวพิมพ์เล็กตัวเลขและขีดล่าง
คำตอบ:
หากต้องการจับคู่สตริงที่มีเฉพาะอักขระเหล่านั้น (หรือสตริงว่าง) ให้ลอง
"^[a-zA-Z0-9_]*$"
สิ่งนี้ใช้ได้กับการแสดงออกปกติ. NET และอาจมีภาษาอื่นอีกมากมายเช่นกัน
ทำลายมันลง:
^ : start of string
[ : beginning of character group
a-z : any lowercase letter
A-Z : any uppercase letter
0-9 : any digit
_ : underscore
] : end of character group
* : zero or more of the given characters
$ : end of string
หากคุณไม่ต้องการอนุญาตให้ใช้สตริงว่างให้ใช้ + แทน *
เป็นคนอื่นได้ชี้ให้เห็นบางภาษา regex [a-zA-Z0-9_]
มีรูปแบบที่จดชวเลข ในภาษา. NET regex คุณสามารถเปิดใช้งาน ECMAScript และใช้\w
เป็นแบบย่อ (ให้ผล^\w*$
หรือ^\w+$
) โปรดทราบว่าในภาษาอื่นและโดยปกติแล้วใน. NET \w
จะค่อนข้างกว้างกว่าและจะจับคู่อักขระ Unicode ประเภทอื่นเช่นกัน (ขอบคุณ Jan ที่ชี้ให้เห็นสิ่งนี้) ดังนั้นหากคุณต้องการจับคู่เฉพาะอักขระเหล่านั้นจริงๆการใช้รูปแบบที่ชัดเจน (อีกต่อไป) น่าจะดีที่สุด
[\p{upper}\p{lower}\p{gc=Number}_]
คือทั้งหมดที่คุณต้องทำสิ่งนี้ถูกต้องทึกทักเอาว่าไม่มีตัวละครรวม
มีการใช้คำฟุ่มเฟื่อยมากมายในที่นี้และฉันลึกลงไปกับมันดังนั้นคำตอบสรุปของฉันจะเป็น:
/^\w+$/
\w
ซึ่งเทียบเท่ากับ[A-Za-z0-9_]
สิ่งที่คุณต้องการ (ยกเว้นว่าเราแนะนำ Unicode ให้กับการผสม)
การใช้ตัว+
ระบุปริมาณคุณจะจับคู่อักขระอย่างน้อยหนึ่งตัว หากคุณต้องการยอมรับสตริงว่างให้ใช้*
แทน
\w
ไม่ได้ จำกัด อยู่ที่ ASCII เพียงอย่างเดียว
[a-z]
และรูปแบบต่างๆ \w
จะจับตัวละครที่ไม่ใช่ละตินเช่นกัน กด Like šēēā
หรือкукареку
คุณต้องการตรวจสอบว่าตัวละครแต่ละตัวตรงกับความต้องการของคุณซึ่งเป็นเหตุผลที่เราใช้:
[A-Za-z0-9_]
และคุณยังสามารถใช้เวอร์ชั่นย่อได้:
\w
ซึ่งเทียบเท่า (ในบางรสชาติของ regex ดังนั้นตรวจสอบให้แน่ใจก่อนที่จะใช้) จากนั้นเพื่อระบุว่าสตริงทั้งหมดต้องตรงกันคุณใช้:
^
ในการระบุสตริงจะต้องเริ่มต้นด้วยตัวอักษรนั้นจากนั้นใช้
$
ในการระบุสตริงต้องลงท้ายด้วยอักขระนั้น จากนั้นใช้
\w+ or \w*
เพื่อระบุ "1 หรือมากกว่า" หรือ "0 หรือมากกว่า" รวบรวมทุกอย่างเข้าด้วยกันเรามี:
^\w*$
อืมคำถาม: มันต้องมีตัวละครอย่างน้อยหนึ่งตัวหรือไม่? เป็นสตริงว่างได้ไหม
^[A-Za-z0-9_]+$
จะทำอย่างน้อยหนึ่งตัวอักษรหรือตัวเลขบนหรือล่างและขีดเส้นใต้ หากมันมีความยาวเป็นศูนย์ให้เปลี่ยนเครื่องหมาย + เป็น * แทน
^[A-Za-z0-9_]*$
แก้ไข:
หากต้องมีการออกเสียงกำกับ (เช่น cedilla - ç) คุณจะต้องใช้ตัวอักษรคำที่เหมือนกันกับข้างต้น แต่รวมถึงตัวอักษรกำกับเสียงด้วย:
^\w+$
หรือ
^\w*$
แม้ว่ามันจะละเอียดกว่า\w
ฉันเองก็สามารถอ่านชื่อคลาสอักขระ POSIX ได้เต็มรูปแบบ ( http://www.zytrax.com/tech/web/regex.htm#special ) ดังนั้นฉันจึงพูดว่า:
^[[:alnum:]_]+$
อย่างไรก็ตามในขณะที่เอกสารที่ลิงค์ด้านบนระบุว่า\w
"จะจับคู่อักขระใด ๆ ในช่วง 0 - 9, A - Z และ a - z (เทียบเท่ากับ POSIX [: alnum:])" ฉันไม่พบสิ่งนี้ว่าเป็นจริง . ไม่ได้grep -P
อยู่ดี คุณจำเป็นต้องชัดเจนรวมถึงขีดถ้าคุณใช้แต่ไม่ได้ถ้าคุณใช้[:alnum:]
\w
คุณไม่สามารถเอาชนะสิ่งต่อไปนี้ได้ทั้งแบบสั้นและหวาน
^\w+$
นอกเหนือจากความสามารถในการอ่านแล้วการใช้คลาสอักขระ POSIX ( http://www.regular-expressions.info/posixbrackets.html ) หมายความว่า regex ของคุณสามารถทำงานกับสตริงที่ไม่ใช่ ASCII ซึ่งช่วงที่ใช้ regex จะไม่ทำงาน การเรียงลำดับตัวอักษรพื้นฐานของ ASCII ซึ่งอาจแตกต่างจากชุดอักขระอื่นดังนั้นจะยกเว้นอักขระที่ไม่ใช่ ASCII (ตัวอักษรเช่นœ) ที่คุณอาจต้องการจับภาพ
ในสาขาวิทยาการคอมพิวเตอร์ค่าตัวอักษรและตัวเลขมักจะหมายถึงอักขระตัวแรกไม่ใช่ตัวเลข แต่เป็นตัวอักษรหรือขีดล่าง หลังจากนั้นตัวละครสามารถ0-9
, A-Z
, a-z
หรือขีดล่าง (_
)
นี่คือวิธีที่คุณจะทำ:
ทดสอบภายใต้ php:
$regex = '/^[A-Za-z_][A-Za-z\d_]*$/'
หรือรับสิ่งนี้
^[A-Za-z_][A-Za-z\d_]*$
และวางไว้ในภาษาการพัฒนาของคุณ
เกี่ยวกับ:
^([A-Za-z]|[0-9]|_)+$
... หากคุณต้องการชัดเจนหรือ:
^\w+$
... หากคุณต้องการรัดกุม (ไวยากรณ์ Perl)
ใช้ lookaheads เพื่อทำสิ่ง "อย่างน้อยหนึ่ง" เชื่อใจฉันมันง่ายกว่ามาก
นี่คือตัวอย่างที่ต้องใช้อักขระ 1-10 ตัวซึ่งมีอย่างน้อยหนึ่งตัวและหนึ่งตัวอักษร:
^(?=.*\d)(?=.*[A-Za-z])[A-Za-z0-9]{1,10}$
หมายเหตุ: สามารถใช้ \ w ได้ แต่จากนั้นข้อควรพิจารณาของ ECMA / Unicode จะเข้ามาเพิ่มความครอบคลุมของอักขระของ \ w "ตัวอักษรคำ"
ลองใช้ส่วนขยายแบบหลายภาษาเหล่านี้ที่ฉันทำไว้กับสตริง
IsAlphaNumeric - สตริงต้องมี atleast 1 อัลฟา (ตัวอักษรในช่วง Unicode ที่ระบุใน charSet) และ atleast 1 หมายเลข (ระบุใน numSet) นอกจากนี้สตริงควรประกอบด้วยเฉพาะอัลฟาและตัวเลข
IsAlpha - สตริงควรมีอย่างน้อย 1 อัลฟา (ในภาษา charSet ที่ระบุ) และประกอบด้วยอัลฟ่าเท่านั้น
IsNumeric - สตริงควรมีอย่างน้อย 1 หมายเลข (ในภาษาที่ระบุไว้ numSet) และประกอบด้วยตัวเลขเท่านั้น
สามารถระบุช่วง charSet / numSet สำหรับภาษาที่ต้องการได้ ช่วง Unicode มีอยู่ที่ลิงค์ด้านล่าง:
http://www.ssec.wisc.edu/~tomw/java/unicode.html
API:
public static bool IsAlphaNumeric(this string stringToTest)
{
//English
const string charSet = "a-zA-Z";
const string numSet = @"0-9";
//Greek
//const string charSet = @"\u0388-\u03EF";
//const string numSet = @"0-9";
//Bengali
//const string charSet = @"\u0985-\u09E3";
//const string numSet = @"\u09E6-\u09EF";
//Hindi
//const string charSet = @"\u0905-\u0963";
//const string numSet = @"\u0966-\u096F";
return Regex.Match(stringToTest, @"^(?=[" + numSet + @"]*?[" + charSet + @"]+)(?=[" + charSet + @"]*?[" + numSet + @"]+)[" + charSet + numSet +@"]+$").Success;
}
public static bool IsNumeric(this string stringToTest)
{
//English
const string numSet = @"0-9";
//Hindi
//const string numSet = @"\u0966-\u096F";
return Regex.Match(stringToTest, @"^[" + numSet + @"]+$").Success;
}
public static bool IsAlpha(this string stringToTest)
{
//English
const string charSet = "a-zA-Z";
return Regex.Match(stringToTest, @"^[" + charSet + @"]+$").Success;
}
การใช้งาน:
//English
string test = "AASD121asf";
//Greek
//string test = "Ϡϛβ123";
//Bengali
//string test = "শর৩৮";
//Hindi
//string test = @"क़लम३७ख़";
bool isAlphaNum = test.IsAlphaNumeric();
regex ต่อไปนี้ตรงกับตัวอักษรและตัวเลขและเครื่องหมายขีดล่าง:
^[a-zA-Z0-9_]+$
ตัวอย่างเช่นใน Perl:
#!/usr/bin/perl -w
my $arg1 = $ARGV[0];
# check that the string contains *only* one or more alphanumeric chars or underscores
if ($arg1 !~ /^[a-zA-Z0-9_]+$/) {
print "Failed.\n";
} else {
print "Success.\n";
}
สิ่งนี้น่าจะใช้ได้ในกรณีส่วนใหญ่
/^[\d]*[a-z_][a-z\d_]*$/gi
และโดยส่วนใหญ่ฉันหมายถึง
abcd True
abcd12 True
ab12cd True
12abcd True
1234 False
^ ... $
- จับคู่รูปแบบที่เริ่มต้นและลงท้ายด้วย[\d]*
- จับคู่ตัวเลขศูนย์หรือมากกว่า[a-z_]
- จับคู่ตัวอักษรหรือขีดล่าง[a-z\d_]*
- จับคู่ตัวอักษรหรือตัวเลขหรือขีดเส้นใต้/gi
- จับคู่ทั่วโลกผ่านสตริงและตัวพิมพ์เล็ก1234
เป็นคำจากภาษาที่มีการร้องขอโดยผู้เขียน ภาษาของคุณเข้มงวดมากขึ้น
สำหรับฉันมีปัญหาที่ฉันต้องการแยกความแตกต่างระหว่างอัลฟ่าตัวเลขและอัลฟาดังนั้นเพื่อให้แน่ใจว่าสตริงตัวอักษรและตัวเลขมีอย่างน้อยหนึ่งอัลฟาและอย่างน้อยหนึ่งที่ฉันใช้:
^([a-zA-Z_]{1,}\d{1,})+|(\d{1,}[a-zA-Z_]{1,})+$
นี่คือ regex สำหรับสิ่งที่คุณต้องการด้วย quantifier เพื่อระบุอย่างน้อย 1 ตัวอักษรและไม่เกิน 255 ตัวอักษร
[^a-zA-Z0-9 _]{1,255}
สำหรับผู้ที่กำลังมองหาการจับคู่ตัวอักษรและตัวเลข unicode คุณอาจต้องการทำสิ่งต่อไปนี้
^[\p{L} \p{Nd}_]+$
อ่านเพิ่มเติมได้ที่ http://unicode.org/reports/tr18/ และที่ http://www.regular-expressions.info/unicode.html
ฉันเชื่อว่าคุณไม่ได้ใช้อักขระละตินและ Unicode ในการแข่งขันของคุณ ตัวอย่างเช่นหากคุณต้องการใช้ตัวอักษร "ã" หรือ "ü" การใช้ "\ w" จะไม่ทำงาน
คุณสามารถใช้วิธีนี้:
^[A-ZÀ-Ýa-zà-ý0-9_]+$
หวังว่ามันจะช่วย!
ในการตรวจสอบสตริงทั้งหมดและไม่อนุญาตให้ใช้สตริงว่างลอง
^[A-Za-z0-9_]+$
^\w*$
จะทำงานกับชุดค่าผสมด้านล่าง
1
123
1av
pRo
av1
มันใช้งานได้สำหรับฉันคุณสามารถลอง
[\\p{Alnum}_]
สิ่งนี้ใช้งานได้สำหรับฉันพบสิ่งนี้ใน "Mastering Regular Expressions" ของ O'Reilly:
/^\w+$/
คำอธิบาย:
ยืนยันตัวเอง:
const regex = /^\w+$/;
const str = `nut_cracker_12`;
let m;
if ((m = regex.exec(str)) !== null) {
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}