Regex เพื่อทดสอบว่าสตริงเริ่มต้นด้วย http: // หรือ https: //


200

ฉันพยายามตั้งค่า regexp ซึ่งจะตรวจสอบการเริ่มต้นของสตริงและถ้ามันมีอย่างใดอย่างหนึ่งhttp://หรือhttps://ควรจะตรงกับมัน

ฉันจะทำสิ่งนั้นได้อย่างไร ฉันพยายามต่อไปนี้ซึ่งใช้งานไม่ได้:

^[(http)(https)]://

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

2
คุณกำลังสร้างกลุ่มของตัวละคร[]ด้วย มันจะ mach หนึ่งตัวละครที่เป็นทั้ง(, ), h, t, t, หรือp sคือมันจะตรงs://แต่ไม่หรือht:// x://
เฟลิกซ์คลิง

2
@templatetypedef: ฉันคิดว่าฉันรู้สึกถึงการเพิ่มประสิทธิภาพก่อนเวลาอันควร
cdhowie

4
หลายคนที่ทันสมัยห้องสมุดแสดงออกปกติเป็นไปอย่างรวดเร็วมาก นอกเสียจากว่าจะมีการติดตามกลับจำนวนมากนิพจน์ทั่วไปอาจเปรียบเทียบได้ดีหรือดีกว่ากับแนวทางแบบ "index-of" (เปรียบเทียบ/^x/กับ vs indexOf(x) == 0) "เริ่มต้นด้วย" วิธีการสไตล์อาจมีค่าใช้จ่ายน้อยลง แต่ฉันคิดว่ามันไม่ค่อยสำคัญ - เลือกสิ่งที่สะอาดที่สุดซึ่งอาจดีมาก: x.StartWith("http://") || x.StartsWith("https://")- แต่อย่าใช้โค้ดที่ชัดเจนไม่ใช่ความพยายามในการปรับปรุงประสิทธิภาพเว้นแต่ว่าได้ การวิเคราะห์และข้อกำหนด :-)

คำตอบ:


353

การใช้งานของคุณ[]ไม่ถูกต้อง - โปรดทราบว่า[]หมายถึงคลาสตัวละครและจะตรงกับตัวละครตัวเดียวเท่านั้น นิพจน์[(http)(https)]แปลเป็น "จับคู่ a (, ha t, a t, a p, a )หรือ a s." (อักขระที่ซ้ำกันจะถูกละเว้น)

ลองสิ่งนี้:

^https?://

หากคุณต้องการใช้ทางเลือกให้ใช้ไวยากรณ์นี้แทน:

^(http|https)://

เป็นสตริงอินพุต PHP: $ regex = '/ ^ (https?: \ / \ /)';
Steve Tauber

9
สตีฟฉันคิดว่าคุณพลาด / ท้าย: $ regex = '/ ^ (https?: \ / \ /) /';
Axi

10
ในกรณีที่น็อตบางตัวพิมพ์ตัวพิมพ์ใหญ่โดยไม่ตั้งใจ http, $ regex = '/ ^ (https?: \ / \ /) / i';
jeffkee

3
คุณลืมที่จะหลบหนี / ใช้ \ ^https?:\/\/ดังนั้นมันจะเป็น ฉันถูกไหม?
Shafizadeh

4
@Shafizadeh /ไม่ใช่ตัวอักษรพิเศษในการแสดงออกปกติเฉพาะในภาษาที่/ใช้ในการสังเกตการแสดงออกปกติของตัวอักษร ตัวอย่างเช่นไม่จำเป็นที่จะต้องหลบหนี/ในนิพจน์ปกติเมื่อใช้ C # เนื่องจากนิพจน์ทั่วไปของ C # จะแสดง (ส่วนหนึ่ง) เป็นตัวอักษรสตริง คุณไม่ต้องการมันในพูด Perl (เมื่อใช้ตัวคั่นอื่นเป็นในm#^https?://#) ดังนั้นเพื่อพูดถึงความคิดเห็นของคุณโดยตรง: (a) ไม่ฉันไม่ลืมที่จะหลบหนีอะไรเลย (b) คุณจะต้องหลบหนีสิ่งที่ตัวละครได้รับการปฏิบัติเป็นพิเศษในภาษาที่คุณเลือก
cdhowie


25
^https?://

คุณอาจต้องหลบหลีกเครื่องหมายสแลชขึ้นอยู่กับบริบท





0

การทำให้กรณีนี้ไม่ตอบสนองไม่ได้ทำงานใน asp.net ดังนั้นฉันจึงระบุตัวอักษรแต่ละตัว

นี่คือสิ่งที่ฉันต้องทำเพื่อให้มันทำงานใน asp.net RegularExpressionValidator :

[Hh][Tt][Tt][Pp][Ss]?://(.*)

หมายเหตุ:

  • (?i)และการใช้/whatever/iอาจไม่ทำงานเพราะจาวาสคริปต์ไม่ได้นำมาใช้ในทุกกรณี
  • ตอนแรกมี^จุดเริ่มต้น แต่มันไม่สำคัญ แต่สิ่ง(.*)นั้น (นิพจน์ไม่ทำงานโดยที่ไม่ได้ทำงาน(.*)แต่ไม่มี^)
  • ไม่จำเป็นต้องหลบหนี//แม้ว่าอาจเป็นความคิดที่ดี

นี่คือ RegularExpressionValidator แบบเต็มหากคุณต้องการ:

<asp:RegularExpressionValidator ID="revURLHeaderEdit" runat="server" 
    ControlToValidate="txtURLHeaderEdit" 
    ValidationExpression="[Hh][Tt][Tt][Pp][Ss]?://(.*)"
    ErrorMessage="URL should begin with http:// or https://" >
</asp:RegularExpressionValidator>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.