นิพจน์ปกติสำหรับตัวอักษรและตัวเลขและขีดล่าง


585

ฉันต้องการให้มีการแสดงออกปกติที่ตรวจสอบว่าสตริงมีเพียงตัวอักษรบนและตัวพิมพ์เล็กตัวเลขและขีดล่าง

regex 

9
มันเป็นเรื่องน่าเสียดายที่เอนจิน regex ต่างมีวิธีการต่างกันเพื่อให้ตรงกับตัวอักษรและตัวเลข คำถามเช่นนี้ (ค่อนข้างคลุมเครือโดยไม่มีภาษา / regex รสระบุ) ต้องใช้เวลานานมากหรืออย่างน้อยคำตอบที่เป็นระเบียบมากที่อาศัยอยู่ในแต่ละรส
Wiktor Stribiżew

คำตอบ:


938

หากต้องการจับคู่สตริงที่มีเฉพาะอักขระเหล่านั้น (หรือสตริงว่าง) ให้ลอง

"^[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 ที่ชี้ให้เห็นสิ่งนี้) ดังนั้นหากคุณต้องการจับคู่เฉพาะอักขระเหล่านั้นจริงๆการใช้รูปแบบที่ชัดเจน (อีกต่อไป) น่าจะดีที่สุด


8
ถ้าคุณเคยไปที่ประเทศเยอรมนีหรือถ้าคุณเคยเห็นข้อความภาษาเยอรมันเกี่ยวกับคุณจะเห็นสิ่งที่ฉันพูด
โปรแกรมเมอร์ Windows

30
\ w และ [A-Za-z0-9_] ไม่เทียบเท่าในรสชาติของ regex ส่วนใหญ่ w \ รวมถึงตัวอักษรที่มีการออกเสียงตัวอักษรจากสคริปต์อื่น ๆ ฯลฯ
ม.ค. Goyvaerts

4
คำถามเดิมบอกว่า "ตัวอักษรตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก" ดังนั้นจึงดูเหมือนว่า "ตัวอักษร" จากสคริปต์ที่ไม่ใช่ภาษาละตินควรจับคู่
Trejkaz

3
[\p{upper}\p{lower}\p{gc=Number}_]คือทั้งหมดที่คุณต้องทำสิ่งนี้ถูกต้องทึกทักเอาว่าไม่มีตัวละครรวม
tchrist

1
ดูเหมือน preg_match ต้องการรูปแบบของคุณที่จะถูกล้อมรอบด้วยตัวคั่นซึ่งปกติจะทับ ดังนั้นคุณต้องมี "/ ^ [a-zA-Z0-9 _] * $ /" ดูคำถามนี้สำหรับข้อมูลเพิ่มเติม: stackoverflow.com/questions/6445133/… . ดูเพิ่มเติมที่หน้านี้: forums.phpfreaks.com/topic/…
Charlie

346

มีการใช้คำฟุ่มเฟื่อยมากมายในที่นี้และฉันลึกลงไปกับมันดังนั้นคำตอบสรุปของฉันจะเป็น:

/^\w+$/

\wซึ่งเทียบเท่ากับ[A-Za-z0-9_]สิ่งที่คุณต้องการ (ยกเว้นว่าเราแนะนำ Unicode ให้กับการผสม)

การใช้ตัว+ระบุปริมาณคุณจะจับคู่อักขระอย่างน้อยหนึ่งตัว หากคุณต้องการยอมรับสตริงว่างให้ใช้*แทน


67
\wไม่ได้ จำกัด อยู่ที่ ASCII เพียงอย่างเดียว
tchrist

26
ภาษาอังกฤษไม่ใช่ภาษาเดียวในโลกดังนั้นนี่ควรเป็นคำตอบที่ยอมรับไม่ใช่ภาษา[a-z]และรูปแบบต่างๆ \wจะจับตัวละครที่ไม่ใช่ละตินเช่นกัน กด Like šēēāหรือкукареку
Alex

1
ผ่านการตรวจสอบในหน้า 318 ของ O'Reilly "Mastering Regular Expressions"
guidotex

36

คุณต้องการตรวจสอบว่าตัวละครแต่ละตัวตรงกับความต้องการของคุณซึ่งเป็นเหตุผลที่เราใช้:

[A-Za-z0-9_]

และคุณยังสามารถใช้เวอร์ชั่นย่อได้:

\w

ซึ่งเทียบเท่า (ในบางรสชาติของ regex ดังนั้นตรวจสอบให้แน่ใจก่อนที่จะใช้) จากนั้นเพื่อระบุว่าสตริงทั้งหมดต้องตรงกันคุณใช้:

^

ในการระบุสตริงจะต้องเริ่มต้นด้วยตัวอักษรนั้นจากนั้นใช้

$

ในการระบุสตริงต้องลงท้ายด้วยอักขระนั้น จากนั้นใช้

\w+ or \w*

เพื่อระบุ "1 หรือมากกว่า" หรือ "0 หรือมากกว่า" รวบรวมทุกอย่างเข้าด้วยกันเรามี:

^\w*$

10
\ w และ [A-Za-z0-9_] ไม่เทียบเท่าในรสชาติของ regex ส่วนใหญ่ w \ รวมถึงตัวอักษรที่มีการออกเสียงตัวอักษรจากสคริปต์อื่น ๆ ฯลฯ
ม.ค. Goyvaerts

31

อืมคำถาม: มันต้องมีตัวละครอย่างน้อยหนึ่งตัวหรือไม่? เป็นสตริงว่างได้ไหม

^[A-Za-z0-9_]+$

จะทำอย่างน้อยหนึ่งตัวอักษรหรือตัวเลขบนหรือล่างและขีดเส้นใต้ หากมันมีความยาวเป็นศูนย์ให้เปลี่ยนเครื่องหมาย + เป็น * แทน

^[A-Za-z0-9_]*$

แก้ไข:

หากต้องมีการออกเสียงกำกับ (เช่น cedilla - ç) คุณจะต้องใช้ตัวอักษรคำที่เหมือนกันกับข้างต้น แต่รวมถึงตัวอักษรกำกับเสียงด้วย:

^\w+$

หรือ

^\w*$

ตอนนี้ที่คุณพูดถึงมันฉันก็คิดถึงตัวละครภาษาฝรั่งเศสอื่น ๆ อีกมากมาย ...
BenAlabaster

1
\ w เหมือนกับ [\ w] โดยใช้ความพยายามในการพิมพ์น้อยลง
Jan Goyvaerts

ใช่คุณยังต้องใช้เครื่องหมาย + หรือ * และ ^ และ $ - \ w เพียงตรวจสอบว่ามีอักขระคำไม่เพียง แต่ประกอบด้วยอักขระคำเท่านั้น ...
BenAlabaster

สิ่งนี้ยังช่วยให้เครื่องหมาย $
Induster

@Induster ก็เพราะสิ่งที่ BenAlabaster เพียงแค่ชี้ให้เห็น
Sebas

27

แม้ว่ามันจะละเอียดกว่า\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 (ตัวอักษรเช่นœ) ที่คุณอาจต้องการจับภาพ


22

ในสาขาวิทยาการคอมพิวเตอร์ค่าตัวอักษรและตัวเลขมักจะหมายถึงอักขระตัวแรกไม่ใช่ตัวเลข แต่เป็นตัวอักษรหรือขีดล่าง หลังจากนั้นตัวละครสามารถ0-9, A-Z, a-zหรือขีดล่าง (_ )

นี่คือวิธีที่คุณจะทำ:

ทดสอบภายใต้ php:

$regex = '/^[A-Za-z_][A-Za-z\d_]*$/'

หรือรับสิ่งนี้

^[A-Za-z_][A-Za-z\d_]*$

และวางไว้ในภาษาการพัฒนาของคุณ


17

เกี่ยวกับ:

^([A-Za-z]|[0-9]|_)+$

... หากคุณต้องการชัดเจนหรือ:

^\w+$

... หากคุณต้องการรัดกุม (ไวยากรณ์ Perl)


12

ใช้ lookaheads เพื่อทำสิ่ง "อย่างน้อยหนึ่ง" เชื่อใจฉันมันง่ายกว่ามาก

นี่คือตัวอย่างที่ต้องใช้อักขระ 1-10 ตัวซึ่งมีอย่างน้อยหนึ่งตัวและหนึ่งตัวอักษร:

^(?=.*\d)(?=.*[A-Za-z])[A-Za-z0-9]{1,10}$

หมายเหตุ: สามารถใช้ \ w ได้ แต่จากนั้นข้อควรพิจารณาของ ECMA / Unicode จะเข้ามาเพิ่มความครอบคลุมของอักขระของ \ w "ตัวอักษรคำ"


เราจะทำอย่างไรถ้าเราต้องการเพิ่ม _ และ - ลงในรายการ?
Rahi

10

ลองใช้ส่วนขยายแบบหลายภาษาเหล่านี้ที่ฉันทำไว้กับสตริง

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();

@Shah: ฉันได้เพิ่มตัวอักษรเท่านั้น (และตัวเลขเท่านั้น)
Shantanu

8

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";
}

รูปแบบในรหัสของคุณถูกต้อง แต่รูปแบบด้านบนจะตรวจสอบอินสแตนซ์เดียวเท่านั้น
BenAlabaster

นั่นคือเจตนาตัวอย่างรหัสมีไว้เพื่อการใช้งานที่ชัดเจนในการตรวจสอบสตริง นอกจากนี้สาเหตุที่รหัสมีจุดเริ่มต้นและจุดสิ้นสุดของเครื่องหมายบรรทัดเช่นกันซึ่งไม่ได้อยู่ในตัวอย่างของ regex
Jay

1
@Windows โปรแกรมเมอร์ - en.wikipedia.org/wiki/Alphanumeric - ตัวอักษรละตินไม่ใช่ "ชุดตัวอักษรละติน" ซึ่งเป็นสิ่งที่รวมถึงการกำกับออกเสียง ฯลฯ ปัญหาซีแมนติกส์ล้วนๆแต่ส่วนตัวแล้วฉันจะใช้คำทั่วไปกับตัวอักษรและตัวเลขเป็น AZ และ 0-9
Jay

2
ñเป็นตัวอักษรในภาษาสเปนรวมถึงในละตินอเมริกา
โปรแกรมเมอร์ Windows

2
"ฉันต้องการให้มีการแสดงออกปกติที่ตรวจสอบว่าสตริงมีเพียงตัวอักษรบนและตัวพิมพ์เล็กตัวเลขและขีดล่าง" ไม่ได้ จำกัด ไว้ที่ตัวอักษรละติน "regex ต่อไปนี้ตรงกับตัวอักษรและตัวเลขและขีดล่าง" ไม่ได้ จำกัด เฉพาะตัวอักษรละติน "^ [a-zA-Z0-9 _] + $" ล้มเหลว
โปรแกรมเมอร์ Windows

6

สิ่งนี้น่าจะใช้ได้ในกรณีส่วนใหญ่

/^[\d]*[a-z_][a-z\d_]*$/gi

และโดยส่วนใหญ่ฉันหมายถึง

abcd       True
abcd12     True
ab12cd     True
12abcd     True

1234       False


คำอธิบาย

  1. ^ ... $ - จับคู่รูปแบบที่เริ่มต้นและลงท้ายด้วย
  2. [\d]* - จับคู่ตัวเลขศูนย์หรือมากกว่า
  3. [a-z_] - จับคู่ตัวอักษรหรือขีดล่าง
  4. [a-z\d_]* - จับคู่ตัวอักษรหรือตัวเลขหรือขีดเส้นใต้
  5. /gi - จับคู่ทั่วโลกผ่านสตริงและตัวพิมพ์เล็ก

2
คำถามเดิมไม่มีข้อกำหนดที่จะต้องมีจดหมาย
Dmitry Kuzminov

คุณกำลังพูดถึงจดหมายฉบับใด regex ของฉันมีสิ่งที่ถามในคำถาม ตัวอักษรตัวเลขขีดล่าง
Chinmaya Pati

1234เป็นคำจากภาษาที่มีการร้องขอโดยผู้เขียน ภาษาของคุณเข้มงวดมากขึ้น
Dmitry Kuzminov

4

สำหรับฉันมีปัญหาที่ฉันต้องการแยกความแตกต่างระหว่างอัลฟ่าตัวเลขและอัลฟาดังนั้นเพื่อให้แน่ใจว่าสตริงตัวอักษรและตัวเลขมีอย่างน้อยหนึ่งอัลฟาและอย่างน้อยหนึ่งที่ฉันใช้:

^([a-zA-Z_]{1,}\d{1,})+|(\d{1,}[a-zA-Z_]{1,})+$

สิ่งที่ฉันต้องการ ... ขอบคุณ
Aniket kale

3

นี่คือ regex สำหรับสิ่งที่คุณต้องการด้วย quantifier เพื่อระบุอย่างน้อย 1 ตัวอักษรและไม่เกิน 255 ตัวอักษร

[^a-zA-Z0-9 _]{1,255}

2

สำหรับผู้ที่กำลังมองหาการจับคู่ตัวอักษรและตัวเลข unicode คุณอาจต้องการทำสิ่งต่อไปนี้

^[\p{L} \p{Nd}_]+$

อ่านเพิ่มเติมได้ที่ http://unicode.org/reports/tr18/ และที่ http://www.regular-expressions.info/unicode.html


หากคุณต้องการให้ละตินทำ p {ละติน} แทน p {L}
Agustin

2

ฉันเชื่อว่าคุณไม่ได้ใช้อักขระละตินและ Unicode ในการแข่งขันของคุณ ตัวอย่างเช่นหากคุณต้องการใช้ตัวอักษร "ã" หรือ "ü" การใช้ "\ w" จะไม่ทำงาน

คุณสามารถใช้วิธีนี้:

^[A-ZÀ-Ýa-zà-ý0-9_]+$

หวังว่ามันจะช่วย!



1

^\w*$ จะทำงานกับชุดค่าผสมด้านล่าง

1
123
1av
pRo
av1

สิ่งที่เกี่ยวกับบรรทัดว่าง มันเป็นสตริงตัวอักษรและตัวเลขด้วยหรือไม่
v010dya


0

สิ่งนี้ใช้งานได้สำหรับฉันพบสิ่งนี้ใน "Mastering Regular Expressions" ของ O'Reilly:

/^\w+$/

คำอธิบาย:

  • ^ ยืนยันตำแหน่งที่จุดเริ่มต้นของสตริง
    • \ w + จับคู่อักขระคำใด ๆ (เท่ากับ [a-zA-Z0-9_])
    • "+" Quantifier - จับคู่ระหว่างหนึ่งและไม่ จำกัด จำนวนครั้งมากที่สุดเท่าที่เป็นไปได้ให้กลับมาตามที่ต้องการ (โลภ)
  • $ asserts ตำแหน่งที่ส่วนท้ายของสตริง

ยืนยันตัวเอง:

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}`);
    });
}

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.