นิพจน์ปกติ - ไวยากรณ์

regex (regular expression) อธิบายชุดของสตริงที่สามารถใช้เพื่อตรวจสอบว่าสตริงย่อยมีบางอย่างที่ตรงกับ substring ไม่เปลี่ยนหรือลบเงื่อนไขตรงกับสตริงย่อยจากสตริง เป็นต้น

  • แคตตาล็อกคอลัมน์ dir * * * * * * * * .txt LS .txt หรือ * .txt ไม่ได้อยู่ในการแสดงออกปกติเพราะมี * * * * * * * * เป็นไปด้วยความหมายแสดงออกปกติจะแตกต่างกัน
  • วิธีการในการสร้างการแสดงออกปกติและสร้างนิพจน์ทางคณิตศาสตร์ด้วยวิธีเดียวกัน นั่นคือการใช้ความหลากหลายของ metacharacters และผู้ประกอบการสามารถรวมการแสดงออกเล็ก ๆ ร่วมกันเพื่อสร้างการแสดงออกที่มีขนาดใหญ่ ตัวแทนการแสดงออกปกติอาจจะเป็นตัวเดียวตั้งตัวเลือกช่วงของตัวอักษรระหว่างตัวละครหรือการรวมกันของทุกองค์ประกอบเหล่านี้

การแสดงออกปกติเป็นโหมดข้อความประกอบด้วยตัวอักษรที่พบบ่อย (เช่นตัวอักษรจาก A ถึง Z) และอักขระพิเศษ (เรียกว่า "เมตาตัวอักษร") ดังกล่าว คำอธิบายโหมดเมื่อค้นหาข้อความเพื่อให้ตรงกับหนึ่งหรือมากกว่าหนึ่งสาย แสดงออกปกติเป็นแม่แบบโหมดตัวอักษรและสตริงการค้นหาเพื่อให้ตรงกับ

ตัวอักษรธรรมดา

ตัวอักษรธรรมดายังไม่ได้กำหนดอย่างชัดเจนว่า metacharacters ทุกตัวอักษรพิมพ์และไม่พิมพ์ ทั้งหมดนี้รวมถึงตัวอักษรตัวพิมพ์ใหญ่และพิมพ์เล็กตัวเลขทั้งหมดเครื่องหมายวรรคตอนและสัญลักษณ์อื่น ๆ

อักขระที่ไม่ใช่การพิมพ์

อักขระที่ไม่ใช่การพิมพ์ยังสามารถเป็นส่วนหนึ่งของการแสดงออกปกติ ตารางต่อไปนี้แสดงลำดับหนีที่เป็นตัวแทนของอักขระที่ไม่ใช่การพิมพ์:

字符 描述
\cx 匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。
\f 匹配一个换页符。等价于 \x0c 和 \cL。
\n 匹配一个换行符。等价于 \x0a 和 \cJ。
\r 匹配一个回车符。等价于 \x0d 和 \cM。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t 匹配一个制表符。等价于 \x09 和 \cI。
\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。

ตัวอักษรพิเศษ

ที่เรียกว่าตัวอักษรพิเศษคือการที่ตัวละครบางตัวมีความหมายพิเศษตามที่มันบอกว่า "* .txt" ใน * หมายความว่าการเป็นตัวแทนสตริงของความหมายใด ๆ หากคุณต้องการที่จะหาชื่อไฟล์ที่มีไฟล์ * คุณจะต้องหลบหนี * ที่เป็นบวกในด้านหน้า \ LS \ *. txt

metacharacters จำนวนมากต้องดูแลเป็นพิเศษเมื่อพยายามที่จะตรงกับพวกเขา เพื่อให้ตรงกับตัวอักษรพิเศษเหล่านี้คุณจะต้องทำให้ตัวละคร "หลบหนี" ที่เป็นตัวอักษรทับขวา (\) ในด้านหน้าของพวกเขา ตารางต่อไปนี้แสดงตัวอักษรพิเศษแสดงออกปกติ:

特别字符 描述
$ 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,请使用 \$。
( ) 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)。
* 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。
+ 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。
. 匹配除换行符 \n之外的任何单字符。要匹配 .,请使用 \。
[ 标记一个中括号表达式的开始。要匹配 [,请使用 \[。
? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。
\ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\\' 匹配 "\",而 '\(' 则匹配 "("。
^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 \^。
{ 标记限定符表达式的开始。要匹配 {,请使用 \{。
| 指明两项之间的一个选择。要匹配 |,请使用 \|。

รอบคัดเลือก

รอบคัดเลือกจะใช้ในการระบุการแสดงออกปกติขององค์ประกอบที่กำหนดต้องปรากฏหลายครั้งเพื่อให้ตรงกับการแข่งขัน มี * หรือ + หรือ? หรือ {n} หรือ {n,} หรือ {n, m} รวม 6

การแสดงออกปกติรอบคัดเลือกมีดังนี้:

字符 描述
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
? 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。
{n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
{n,} n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。

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

/Chapter [1-9][0-9]*/

โปรดทราบว่ารอบคัดเลือกปรากฏขึ้นหลังจากช่วงการแสดงออก ดังนั้นจึงนำไปใช้กับทั้งช่วงของการแสดงออกในกรณีนี้จะมีเพียงจำนวนที่ระบุ 0-9 (รวมทั้ง 0 และ 9)

+ รอบคัดเลือกไม่ได้ใช้ที่นี่เป็นครั้งที่สองในตำแหน่งหรือตำแหน่งด้านหลังไม่จำเป็นต้องมีตัวเลข มิได้ใช้? ตัวละครเพราะมัน จำกัด หมายเลขบทเพียงตัวเลขสองหลัก คุณจำเป็นต้องตรงกับอย่างน้อยหนึ่งบทที่จำนวนตัวอักษรและพื้นที่ด้านหลัง

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

/Chapter [0-9]{1,2}/

ข้อเสียของการแสดงออกดังกล่าวข้างต้นมีค่ามากกว่า 99 บทยังคงเป็นตัวเลขเท่านั้นตรงกับจุดเริ่มต้นของสองตัวเลข ข้อเสียก็คือว่าบทที่ 0 ยังจะตรงกับ การจับคู่ที่ดีขึ้นของตัวเลขเพียงสองหลักในการแสดงออกเป็นดังนี้:

/Chapter [1-9][0-9]?/

หรือ

/Chapter [1-9][0-9]{0,1}/

* + และ? บ่นมีความโลภเพราะพวกเขาตรงกับข้อความมากที่สุดเท่าที่เพียงอยู่เบื้องหลังพวกเขาพร้อมหรือไม่สามารถทำได้ไม่โลภหรือน้อยที่สุดการแข่งขัน

ตัวอย่างเช่นคุณอาจค้นหาเอกสาร HTML เพื่อหาที่อยู่ใน H1 แท็กส่วนหัว ข้อความในเอกสารของคุณดังนี้

<H1>Chapter 1 – Introduction to Regular Expressions</H1>

เนื้อหาทั้งหมดตรงกับการแสดงออกดังต่อไปนี้เริ่มต้นจากเครื่องหมายน้อยกว่า (<) เพื่อปิดแท็ก H1 มากกว่าสัญลักษณ์ (>) ระหว่าง

/<.*>/

หากคุณจะต้องให้ตรงกับจุดเริ่มต้นของ H1 แท็กต่อไปนี้ "ไม่โลภ" การแสดงออกตรงเท่านั้น <h1>

/<.*?>/

โดย * + หรือหลังจากที่คัดเลือกหรือไม่แสดงออกสามารถเปลี่ยนจาก "โลภ" กับ "ไม่โลภ" หรือน้อยจับคู่แสดงออก

ผู้แทนจำหน่าย

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

ค้นหาผู้ขายใช้ในการอธิบายสตริงหรือคำเขตแดน ^ และ $ หมายถึงจุดเริ่มต้นและจุดสิ้นสุดของสตริงคำอธิบายเขตแดน \ B ก่อนหรือหลังคำว่า \ B หมายถึงเขตแดนไม่ใช่คำ

การแสดงออกปกติรอบคัดเลือกมีดังนี้:

字符 描述
^ 匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与 \n 或 \r 之后的位置匹配。
$ 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与 \n 或 \r 之前的位置匹配。
\b 匹配一个字边界,即字与空格间的位置。
\B 非字边界匹配。

หมายเหตุ: คุณไม่สามารถใช้รอบคัดเลือกและสมอจุด เพราะทันทีก่อนหรือหลังการตัดหรือคำขอบเขตไม่สามารถมีมากกว่าหนึ่งตำแหน่งและดังนั้นจึงไม่อนุญาตให้มีการแสดงออกดังกล่าวเช่น ^ *

เพื่อให้ตรงกับบรรทัดของข้อความที่จุดเริ่มต้นของข้อความโปรดเริ่มใช้การแสดงออก n ^ ตัวละคร ^ อย่าใช้การใช้งานนี้แสดงออกในวงเล็บภายในสับสน

เพื่อให้ตรงกับข้อความที่ท้ายบรรทัดของข้อความที่เห็นจุดสิ้นสุดของการแสดงออกโดยใช้ $ ตัวละครในเชิงบวก

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

/^Chapter [1-9][0-9]{0,1}/

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

/^Chapter [1-9][0-9]{0,1}$/

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

/\bCha/

\ ตำแหน่งตัวอักษร B เป็นสิ่งที่สำคัญมาก ถ้ามันตั้งอยู่ที่จุดเริ่มต้นของสตริงที่จะจับคู่มันก็ดูสำหรับการแข่งขันในการเริ่มต้นของคำว่า ถ้ามันเป็นที่สิ้นสุดของสตริงจะมองหาการแข่งขันในตอนท้ายของคำ ยกตัวอย่างเช่นนิพจน์ต่อไปนี้ที่ตรงกับคำพูดบทสตริงตรีตามที่ปรากฏในหน้าของขอบเขตของคำนี้:

/ter\b/

นิพจน์ต่อไปนี้ตรงกับบทสตริง Apt แต่ไม่ตรงกับความถนัดสตริงพาร์ทเมนต์:

/\Bapt/

สตริงคำพาร์ทเมนต์ที่ปรากฏอยู่ในขอบเขตที่ไม่ใช่คำบท แต่คำที่ปรากฏในความถนัดของขอบเขตคำว่า สำหรับผู้ประกอบการที่ไม่ใช่เขตแดนคำ B \ ตำแหน่งไม่สำคัญเพราะการแข่งขันไม่สนใจไม่ว่าจะเป็นที่จุดเริ่มต้นหรือจุดสิ้นสุดของคำ

เลือก

ใช้วงเล็บเพื่อใส่ทั้งหมดของการเลือกที่มีตัวเลือกระหว่างที่อยู่ติดกันแยกจากกันโดย | แต่มีผลข้างเคียงของการใช้วงเล็บเป็นแมตช์ที่เกี่ยวข้องจะถูกเก็บไว้ที่มีอยู่ในขณะนี้ :? ที่ตัวเลือกแรกที่จะลดผลกระทบด้านนี้

ประเด็น :? ไม่จับองค์ประกอบหนึ่งมีสองไม่ใช่จับองค์ประกอบ = และทั้งสองมีความหมายมากขึ้นในอดีตเป็นบวกก่อนสอบสวนในการเริ่มต้นใด ๆ ที่ถูกจับคู่วงเล็บคือการแสดงออก ??! รูปแบบเพื่อให้ตรงกับตำแหน่งสตริงการค้นหาที่เป็นลบก่อนสอบสวนในตำแหน่งเริ่มต้นใด ๆ ที่ไม่ตรงกับรูปแบบการแสดงออกปกติเพื่อให้ตรงกับสตริงการค้นหา

Backreferences

สำหรับรูปแบบการแสดงออกปกติหรือบางส่วนของรูปแบบทั้งสองด้านจะส่งผลให้ในวงเล็บเพิ่มการแข่งขันที่เกี่ยวข้องกับการจัดเก็บชั่วคราวบัฟเฟอร์แต่ละย่อยจับจะถูกเก็บไว้ในลำดับจากซ้ายไปขวาแข่งขันปรากฏในรูปแบบการแสดงออกปกติ บัฟเฟอร์ฉบับที่ 1 จากจุดเริ่มต้นที่สามารถเก็บได้ถึง 99 จับ subexpression แต่ละบัฟเฟอร์สามารถใช้ '\ n' เยี่ยมชมที่ n คือหนึ่งหรือสองหลักทศนิยมระบุบัฟเฟอร์ที่เฉพาะเจาะจง

คุณสามารถใช้ metacharacters ไม่ใช่จับ ':?' หรือเขียนจับภาพบันทึกที่จะไม่สนใจการแข่งขันที่เกี่ยวข้อง '=?'?!

Backreferences ที่ง่ายที่สุดที่หนึ่งในประโยชน์มากที่สุดคือความสามารถในการที่จะให้ข้อความที่จะได้พบกับสองเหมือนกันตรงกับคำที่อยู่ติดกัน ตัวอย่างเช่นในประโยคต่อไปนี้:

Is is the cost of of gasoline going up up?

ประโยคข้างต้นเห็นได้ชัดว่ามีคำซ้ำหลาย ถ้าเราสามารถประดิษฐ์วิธีการที่จะหาประโยคมากกว่าพบการเกิดซ้ำของแต่ละคำที่ดีมากขึ้น การแสดงออกปกติต่อไปนี้ใช้ subexpression เดียวเพื่อให้บรรลุนี้:

/\b([a-z]+) \1\b/gi

การแสดงออกจับเป็น [az] + ที่กำหนดรวมถึงหนึ่งหรือมากกว่าตัวอักษร ส่วนที่สองของการแสดงออกปกติจะให้ตรงกับเด็กอ้างอิงจับก่อนหน้านี้นั่นคือการเกิดที่สองของคำว่าเพียงแค่การจับคู่โดยการแสดงออกในวงเล็บ \ 1 ระบุแรกย่อยการแข่งขัน คำว่า metacharacters เขตแดนให้แน่ใจว่าเฉพาะการตรวจสอบทั้งคำ มิฉะนั้นวลีเช่น "ออก" หรือ "นี้คือ" และชอบที่จะไม่ถูกต้องระบุสำนวนนี้

แสดงออกปกติหลังแท็กทั่วโลก (g) บ่งชี้ว่าการแสดงออกนี้จะนำไปใช้กับสายป้อนสามารถค้นหาการแข่งขันเป็นจำนวนมาก กรณีการแสดงออกของความรู้สึกในตอนท้ายของ (i) แท็กระบุกรณีตาย การแข่งขันที่มีศักยภาพแท็กหลายสายระบุบรรทัดสามารถเกิดขึ้นได้ทั้งสองด้าน

Backreferences ยังสามารถเป็นทรัพยากรที่ดัชนีสากล (URI) เป็นส่วนประกอบของมัน สมมติว่าคุณต้องการที่จะถูกทำลายลงไปดังต่อไปนี้ URI Protocol (FTP, HTTP, ฯลฯ ) ที่อยู่โดเมนและหน้า / เส้นทาง:

:80/html/html-tutorial

การแสดงออกปกติต่อไปนี้ให้ฟังก์ชันการทำงานนี้:

/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/

subexpression สอดแรกจับส่วนโปรโตคอลของที่อยู่เว็บ subexpression ตรงกับคำใด ๆ ลำไส้ใหญ่และสองไปข้างหน้า slashes ในด้านหน้าของ subexpression วงเล็บสองจับส่วนที่อยู่โดเมนของที่อยู่ หนึ่งหรือมากกว่าหนึ่งตัวละครอื่น ๆ กว่า: subexpression แข่งขัน / และ ที่สาม subexpression สอดจับหมายเลขพอร์ต (หากมีการระบุไว้) ย่อยแสดงออกตรงกับศูนย์หรือมากกว่าตัวเลขหลังจากที่ลำไส้ใหญ่ มันสามารถทำซ้ำได้เมื่อย่อยแสดงออก สุดท้าย subexpression สอดสี่จับเส้นทางที่ระบุอยู่เว็บและ / หรือหน้า นี่ยังไม่รวมย่อยแสดงออกตรงกับลำดับตัวอักษรหรือพื้นที่ # ตัวอักษร

การแสดงออกปกตินำไปใช้กับข้างต้น URI รายการย่อยที่ตรงกันมีองค์ประกอบดังต่อไปนี้:

  • subexpression สอดแรกประกอบด้วย "http"
  • subexpression วงเล็บสองมี "www.w3cschool.cc"
  • subexpression วงเล็บที่สามกับ "80"
  • subexpression สอดสี่ประกอบด้วย "/html/html-tutorial"