นิพจน์ส่วนใหญ่ที่นี่แก้ปัญหากรณีใช้งานที่เฉพาะเจาะจง
ไม่เป็นไร แต่ฉันชอบวิธีการ "ทำงานได้ตลอดเวลา"
function regExpEscape(literal_string) {
return literal_string.replace(/[-[\]{}()*+!<=:?.\/\\^$|#\s,]/g, '\\$&');
}
นี่จะ "หลบหนีอย่างเต็มที่" สตริงตัวอักษรสำหรับการใช้งานใด ๆ ต่อไปนี้ในนิพจน์ทั่วไป
- การแทรกในนิพจน์ปกติ เช่น
new RegExp(regExpEscape(str))
- การแทรกในคลาสอักขระ เช่น
new RegExp('[' + regExpEscape(str) + ']')
- การแทรกตัวระบุจำนวนเต็ม เช่น
new RegExp('x{1,' + regExpEscape(str) + '}')
- การดำเนินการในเอ็นจินนิพจน์ทั่วไปที่ไม่ใช่ JavaScript
ตัวละครพิเศษที่ครอบคลุม:
-
: สร้างช่วงอักขระในคลาสอักขระ
[
/ ]
: เริ่ม / จบคลาสอักขระ
{
/ }
: เริ่ม / สิ้นสุดตัวระบุการคำนวณ
(
/ )
: เริ่ม / สิ้นสุดกลุ่ม
*
/ +
/ ?
: ระบุประเภทการทำซ้ำ
.
: ตรงกับตัวละครใด ๆ
\
: หนีอักขระและเริ่มเอนทิตี้
^
: ระบุจุดเริ่มต้นของการจับคู่โซนและคัดค้านการจับคู่ในคลาสอักขระ
$
: ระบุจุดสิ้นสุดของโซนที่ตรงกัน
|
: ระบุการสลับ
#
: ระบุความคิดเห็นในโหมดระยะห่างฟรี
\s
: ข้ามไปในโหมดระยะห่างฟรี
,
: คั่นค่าในตัวระบุการคำนวณ
/
: เริ่มหรือสิ้นสุดการแสดงออก
:
: เสร็จสิ้นประเภทกลุ่มพิเศษและเป็นส่วนหนึ่งของคลาสอักขระสไตล์ Perl
!
: ลบกลุ่มที่มีความกว้างเป็นศูนย์
<
/ =
: ส่วนหนึ่งของข้อมูลจำเพาะกลุ่มความกว้างเป็นศูนย์
หมายเหตุ:
/
ไม่จำเป็นอย่างเคร่งครัดในรสชาติของการแสดงออกปกติใด ๆ แต่ก็ปกป้องในกรณีที่มีคน(สั่น)eval("/" + pattern + "/");
ไม่
,
ตรวจสอบให้แน่ใจว่าถ้าสตริงนั้นมีความหมายว่าเป็นจำนวนเต็มในตัวระบุตัวเลขมันจะทำให้เกิดข้อผิดพลาดในการรวบรวม RegExp อย่างถูกต้องแทนที่จะรวบรวมผิดอย่างเงียบ ๆ
#
และ\s
ไม่จำเป็นต้องหลบหนีใน JavaScript แต่ทำในรสชาติอื่น ๆ อีกมากมาย พวกเขาจะหลบหนีที่นี่ในกรณีที่การแสดงออกปกติจะถูกส่งต่อไปยังโปรแกรมอื่น
หากคุณต้องการหลักฐานในอนาคตเกี่ยวกับการแสดงออกปกติต่อการเพิ่มความสามารถของเอนจิน JavaScript regex ฉันขอแนะนำให้ใช้ paranoid เพิ่มเติม:
function regExpEscapeFuture(literal_string) {
return literal_string.replace(/[^A-Za-z0-9_]/g, '\\$&');
}
ฟังก์ชันนี้จะยกเว้นอักขระทั้งหมดยกเว้นที่รับประกันอย่างชัดเจนว่าจะไม่ใช้สำหรับไวยากรณ์ในรสชาติการแสดงออกปกติในอนาคต
สำหรับผู้ที่รักการสุขาภิบาลอย่างแท้จริงให้พิจารณากรณีขอบนี้:
var s = '';
new RegExp('(choice1|choice2|' + regExpEscape(s) + ')');
สิ่งนี้ควรรวบรวมใน JavaScript แต่จะไม่อยู่ในรสชาติอื่น ๆ หากตั้งใจที่จะส่งผ่านไปยังรสชาติอื่นs === ''
ควรตรวจสอบกรณีที่ว่างด้วยตนเองเช่น:
var s = '';
new RegExp('(choice1|choice2' + (s ? '|' + regExpEscape(s) : '') + ')');
RegExp.escape
งานอยู่และใครก็ตามที่คิดว่าพวกเขามีความคิดเห็นที่มีค่ายินดีต้อนรับที่จะมีส่วนร่วม core-js และ polyfills อื่น ๆ นำเสนอ