“ \ d” ใน regex หมายถึงตัวเลขหรือไม่


147

ผมพบว่าใน123, \dการแข่งขัน1และแต่ไม่3 2ฉันสงสัยว่า\dตรงกับหลักที่พอใจความต้องการชนิดใด ฉันกำลังพูดถึง regex สไตล์หลาม

ปลั๊กอินนิพจน์ปกติใน Gedit ใช้ Python style regex ฉันสร้างไฟล์ข้อความที่มีเนื้อหาอยู่

123

เฉพาะ1และ3จับคู่โดย regex \d; 2ไม่ใช่.

โดยทั่วไปสำหรับลำดับของตัวเลขหลักที่ไม่มีอักขระอื่น ๆ ในระหว่างนั้นจะมีเพียงเลขลำดับคี่เท่านั้นที่ตรงกันและเลขคู่นั้นไม่ตรงกัน ยกตัวอย่างเช่นในการ12345แข่งขันที่มี1, และ35


4
\dจะตรงกับ1, และ2 3ถ้ามันไม่ต้องมีอย่างอื่นในการแสดงออกของคุณ คุณสามารถแสดงการแสดงออกอย่างเต็มที่ได้ไหม?
Alex Aza

4
\dคือชวเลขดังนั้นจึงควรจะตรงกับ[0-9] 2กรุณาโพสต์กรณีทดสอบที่สมบูรณ์ (สคริปต์ที่สามารถเรียกใช้ซึ่งแสดงให้เห็นถึงปัญหาของคุณ) และบางทีเราอาจจะคิดได้ว่ามีอะไรผิดปกติ
zwol

@delnan: "ฉันพบว่าใน 123, \ d ตรงกับ 1 และ 3 แต่ไม่ใช่ 2" ฟังดูค่อนข้างเป็นรูปธรรมสำหรับฉัน
เหลืองอำพัน

@Amber: ประณามฉันฉันไม่ได้พลาด!

5
โอเคฉันไม่ได้โพสต์สิ่งนี้เป็นคำตอบเพราะฉันไม่รู้แต่ฉันคิดว่าสิ่งที่เกิดขึ้นคือ gedit ปฏิเสธที่จะเริ่มการแข่งขันใหม่ทันทีหลังจากสิ้นสุดการแข่งขันครั้งก่อน - มันข้ามตัวละครตัวหนึ่งไม่ว่ามันจะเป็นอะไร ก่อนพยายามจับคู่อีกครั้ง โปรดลองจับคู่และ11111 22222
zwol

คำตอบ:


460

[0-9] จะไม่เทียบเท่าเสมอ\dไป ใน python3, [0-9]ตรงเพียง0123456789ตัวละครในขณะที่\dการแข่งขัน[0-9]และตัวละครอื่น ๆ ٠١٢٣٤٥٦٧٨٩หลักเช่นเลขตะวันออกอาหรับ


3
ลองใช้วิธีนี้ใน REPL: import re, re.match(r'\d', '٠١٢٣٤٥٦٧٨٩')ไม่พบการจับคู่
nickf

1
@nickf ทดลองใช้กับ python3
Wim

2
สำหรับเปอร์เซียและอาหรับในเครื่องยนต์จาวาและจาวาสคริปต์ให้ใช้ \ p {Nd}
Alireza Fattahi

6
+1 แต่ mmmm ... แท็กของ OP คือPythonและ\dตรงกับหลัก Unicode ใด ๆ ใน Python3 เท่านั้น ใน Python 2.7 มันยังคงเป็น ASCII แบบเก่า[0-9]- มันอาจคุ้มค่าที่จะอธิบายในคำตอบ :)
zx81

1
@FarazAhmad อาจไม่ใช่คุณต้องระบุอักขระทั้งหมดแยกต่างหาก
Kirill Polishchuk


8

ใน Python-style regex \dจับคู่หลักแต่ละตัว หากคุณเห็นสิ่งที่ดูเหมือนจะไม่ทำเช่นนั้นโปรดระบุregex แบบเต็มที่คุณใช้ซึ่งตรงข้ามกับการอธิบายเพียงสัญลักษณ์เดียว

>>> import re
>>> re.match(r'\d', '3')
<_sre.SRE_Match object at 0x02155B80>
>>> re.match(r'\d', '2')
<_sre.SRE_Match object at 0x02155BB8>
>>> re.match(r'\d', '1')
<_sre.SRE_Match object at 0x02155B80>

ขอบคุณ! โปรแกรมแยกวิเคราะห์ regex ของฉันเป็นปลั๊กอินแสดงผลปกติใน gedit 123เนื้อหาทั้งหมดเป็น
ทิม

7

\\d{3} ตรงกับลำดับของตัวเลขสามหลักใด ๆ ใน Java


@ amal-murali, วิธีใช้นิพจน์นี้เพื่อจับคู่ลำดับของตัวเลขใด ๆ ใน java
hasan.alkhatib

2
@HasanKhatib:\\d+
Amal Murali

5

นี่เป็นเพียงการคาดเดา แต่ฉันคิดว่าตัวแก้ไขของคุณตรงกับตัวเลขทุกตัวจริง ๆ1 2 3- แต่เฉพาะการจับคู่คี่ถูกเน้นเพื่อแยกความแตกต่างจากกรณีเมื่อ123จับคู่สตริงทั้งหมด

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


1

ข้อมูลเกี่ยวกับ. NET / C #:

อักขระตำแหน่งทศนิยม: \ d \ d ตรงกับตัวเลขทศนิยมใด ๆ มันเทียบเท่ากับรูปแบบการแสดงออกปกติ \ p {Nd} ซึ่งรวมถึงตัวเลขทศนิยมมาตรฐาน 0-9 เช่นเดียวกับตัวเลขทศนิยมของจำนวนชุดอักขระอื่น ๆ

หากระบุพฤติกรรมที่สอดคล้องกับ ECMAScript \ d จะเท่ากับ [0-9] สำหรับข้อมูลเกี่ยวกับนิพจน์ทั่วไป ECMAScript ให้ดูส่วน "พฤติกรรมการจับคู่ ECMAScript" ในตัวเลือกนิพจน์ปกติ

ข้อมูล: https://docs.microsoft.com/en-us/dotnet/standard/base-types/character-classes-in-regular-expressions#decimal-digit-character-d

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