นิพจน์ทั่วไปสำหรับตัวอักษรตัวเลขและ - _


113

ฉันมีปัญหาในการตรวจสอบใน PHP ว่าค่าเป็นชุดค่าผสมใด ๆ ต่อไปนี้หรือไม่

  • ตัวอักษร (ตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็ก)
  • หมายเลข (0-9)
  • ขีดล่าง (_)
  • เส้นประ (-)
  • จุด (.)
  • ไม่มีช่องว่าง! หรืออักขระอื่น ๆ

ตัวอย่างบางส่วน:

  • ตกลง: "screen123.css"
  • ตกลง: "screen-new-file.css"
  • ตกลง: "screen_new.js"
  • ไม่ตกลง: "screen new file.css"

ฉันเดาว่าฉันต้องการ regex สำหรับสิ่งนี้เนื่องจากฉันต้องแสดงข้อผิดพลาดเมื่อสตริงให้มีอักขระอื่นนอกเหนือจากที่กล่าวมาข้างต้น


^ [\ w .-] * $ -> ซึ่งจะได้ชื่อไฟล์ทั้งหมด
Badri Gs

คำตอบ:


226

รูปแบบที่คุณต้องการมีลักษณะดังนี้ ( ดูใน rubular.com ):

^[a-zA-Z0-9_.-]*$

คำอธิบาย:

  • ^ เป็นจุดเริ่มต้นของจุดยึดสาย
  • $ คือจุดสิ้นสุดของจุดยึดสาย
  • [...] คือนิยามคลาสอักขระ
  • * คือการทำซ้ำแบบ "ศูนย์หรือมากกว่า"

โปรดสังเกตว่าเส้นประตามตัวอักษร-เป็นอักขระสุดท้ายในนิยามคลาสอักขระมิฉะนั้นจะมีความหมายที่แตกต่างออกไป (เช่น range) .นอกจากนี้ยังมีความหมายนิยามคลาสนอกตัวละครที่แตกต่างกัน แต่ภายในมันเป็นเพียงแค่ตัวอักษร.

อ้างอิง


ใน PHP

นี่คือตัวอย่างข้อมูลเพื่อแสดงวิธีใช้รูปแบบนี้:

<?php

$arr = array(
  'screen123.css',
  'screen-new-file.css',
  'screen_new.js',
  'screen new file.css'
);

foreach ($arr as $s) {
  if (preg_match('/^[\w.-]*$/', $s)) {
    print "$s is a match\n";
  } else {
    print "$s is NO match!!!\n";
  };
}

?>

ภาพพิมพ์ด้านบน ( ตามที่เห็นใน ideone.com ):

screen123.css is a match
screen-new-file.css is a match
screen_new.js is a match
screen new file.css is NO match!!!

สังเกตว่ารูปแบบจะแตกต่างกันเล็กน้อยโดยใช้\wแทน นี่คือคลาสอักขระสำหรับ "อักขระคำ"

การอ้างอิง API


หมายเหตุเกี่ยวกับข้อกำหนด

สิ่งนี้ดูเหมือนจะเป็นไปตามข้อกำหนดของคุณ แต่โปรดทราบว่าสิ่งนี้จะตรงกับสิ่งต่างๆเช่น.....ฯลฯ ซึ่งอาจใช่หรือไม่ใช่สิ่งที่คุณต้องการ หากคุณสามารถระบุรูปแบบที่คุณต้องการจับคู่ได้เฉพาะเจาะจงมากขึ้นนิพจน์ทั่วไปจะซับซ้อนขึ้นเล็กน้อย

regex ข้างต้นยังตรงกับสตริงว่าง หากคุณต้องการอย่างน้อยหนึ่งอักขระให้ใช้+(หนึ่งหรือมากกว่า) แทน*(ศูนย์หรือมากกว่า) สำหรับการทำซ้ำ

ไม่ว่าในกรณีใดคุณสามารถชี้แจงข้อกำหนดของคุณเพิ่มเติมได้ (ช่วยได้เสมอเมื่อถามคำถาม regex) แต่หวังว่าคุณจะสามารถเรียนรู้วิธีการเขียนรูปแบบด้วยตัวคุณเองตามข้อมูลข้างต้น


ดูที่ideone.com/5DMCaสำหรับข้อมูลจำเพาะที่แตกต่างกันซึ่งอาจเป็นสิ่งที่คุณต้องการมากกว่า กลับไปกลับมากับฉันในเรื่อง Rubular หากคุณต้องการพัฒนาข้อกำหนดกับฉัน
polygenelubricants

ฉันใช้ Tornado และต้องการจับชื่อ html ดังนั้นฉันจึงใช้สิ่งนี้ตามคำตอบของคุณ ^/([a-zA-Z0-9._-]*\.html)$
NuclearPeon

ฉันจะเพิ่มกฎอื่นซึ่งก็คือ: อักขระตัวสุดท้ายควรเป็นตัวอักษรและตัวเลขคละกัน อัปเดต Regex:/[a-zA-Z0-9]+(\.[a-zA-Z0-9]+){2,}[a-zA-Z0-9^]$/
Consta Gorgan

ผู้ใช้ Go (golang) โปรดทราบรูปแบบที่นี่จะส่งผลfalseให้ตัวอักษรสตริงดิบว่างเปล่า สนามเด็กเล่น . ใช้วิธีการแก้ปัญหา @ nonopolarity ของด้านล่าง
BentCoder

16

คุณสามารถใช้ได้

^[\w\d_.-]+$

+คือการทำให้แน่ใจว่ามันมีอย่างน้อย 1 ตัวอักษร ต้องการ^และ$เพื่อแสดงถึงจุดเริ่มต้นและจุดสิ้นสุดมิฉะนั้นหากสตริงมีการจับคู่ตรงกลางเช่น@@@@xyz%%%%นั้นก็ยังคงตรงกัน


3
ใส่-อันดับแรกในชุดเพื่อหลีกเลี่ยงการกำหนดช่วง และ\wครอบคลุมทั้งตัวอักษรและตัวเลขคละกันและขีดล่าง [\w.-]+ดังนั้นคุณต้อง
Richard

ขอบคุณวิธีนี้ใช้ได้ดีสำหรับฉัน: ^ [\ w \ d _.-] + \. (csv | CSV) $
Dharam Mali

นอกจากนี้ยังสอดคล้องกับตัวอักษรสตริงดิบที่ว่างเปล่าของ Go (golang) ในขณะที่คำตอบที่ยอมรับไม่ได้ทำให้ผู้ใช้ Go ยึดติดกับโซลูชันนี้ Playground
BentCoder

9

เพื่อให้ครอบคลุมรูปแบบของคุณจริงๆเช่นชื่อไฟล์ที่ถูกต้องตามกฎของคุณฉันคิดว่าคุณต้องการมากกว่านี้เล็กน้อย โปรดทราบว่าสิ่งนี้ไม่ตรงกับชื่อไฟล์ทางกฎหมายจากมุมมองของระบบ นั่นจะขึ้นอยู่กับระบบและเสรีมากขึ้นในสิ่งที่ยอมรับ สิ่งนี้มีไว้เพื่อให้ตรงกับรูปแบบที่คุณยอมรับได้

^([a-zA-Z0-9]+[_-])*[a-zA-Z0-9]+\.[a-zA-Z0-9]+$

คำอธิบาย:

  • ^จับคู่จุดเริ่มต้นของสตริง สิ่งนี้ (บวกกับการจับคู่สิ้นสุด) บังคับให้สตริงเป็นไปตามนิพจน์ที่แน่นอนไม่ใช่แค่สตริงย่อยที่ตรงกับนิพจน์
  • ([a-zA-Z0-9]+[_-])*จำนวนตัวอักษรหรือตัวเลขอย่างน้อยหนึ่งตัวที่เกิดขึ้นตามด้วยขีดล่างหรือเส้นประ ซึ่งทำให้ชื่อทั้งหมดที่มีขีดกลางหรือขีดล่างมีตัวอักษรหรือตัวเลขคั่นกลาง
  • [a-zA-Z0-9]+ตัวอักษรหรือตัวเลขอย่างน้อยหนึ่งตัว ซึ่งครอบคลุมชื่อทั้งหมดที่ไม่มีขีดล่างหรือขีด
  • \.ระยะเวลาตามตัวอักษร (จุด) บังคับให้ชื่อไฟล์มีนามสกุลและโดยการแยกออกจากส่วนที่เหลือของรูปแบบอนุญาตให้ใช้เฉพาะช่วงเวลาระหว่างชื่อและนามสกุลเท่านั้น หากคุณต้องการส่วนขยายมากกว่าหนึ่งรายการที่สามารถจัดการได้เช่นกันโดยใช้เทคนิคเดียวกับเส้นประ / ขีดล่างเพียงแค่ตอนท้าย
  • [a-zA-Z0-9]+ตัวอักษรหรือตัวเลขอย่างน้อยหนึ่งตัว นามสกุลต้องมีความยาวอย่างน้อยหนึ่งอักขระและต้องประกอบด้วยตัวอักษรและตัวเลขเท่านั้น นี่เป็นเรื่องปกติ แต่หากคุณต้องการอนุญาตขีดล่างก็สามารถแก้ไขได้เช่นกัน คุณยังสามารถระบุช่วงความยาว{2,3}แทน+ตัวจับคู่หนึ่งตัวขึ้นไปได้หากเหมาะสมกว่า
  • $จับคู่ส่วนท้ายของสตริง ดูอักขระเริ่มต้น

7

นี่คือรูปแบบที่คุณกำลังมองหา

/^[\w-_.]*$/

นี่แปลว่าอะไร:

  • ^ จุดเริ่มต้นของสตริง
  • [...] จับคู่อักขระภายใน
  • \w อักขระคำใดก็ได้ 0-9 a-z A-Z
  • -_.จับคู่-และ_และ.
  • * ไม่มีแบบแผนหรือมากกว่าหรือไม่ จำกัด
  • $ สิ้นสุดสตริง

หากคุณต้องการ จำกัด จำนวนอักขระ:

/^[\w-_.]{0,5}$/

{0,5}หมายถึง0-5อักขระ


var a = / ^ \ w * $ / g a.test ("46545") และผลลัพธ์เป็นเท็จ
Dipak

1
สังเกตว่า\wประกอบด้วย_
Galaxy

4

สิ่งนี้ควรใช้งานได้

$code = "screen new file.css";
if (!preg_match("/^[-_a-zA-Z0-9.]+$/", $code))
{
    echo "not valid";
}

สิ่งนี้จะสะท้อนว่า "ไม่ถูกต้อง"


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