คำถามเกี่ยวกับ Coldfusion Regex

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

<cfset isValid= true/>
<cfif REFind("[^[:alnum:]]", arguments.stringToCheck, 1) GT 0>
 <cfset isValid= false />
</cfif>

ขอบคุณ


person Paolo Broccardo    schedule 21.09.2010    source แหล่งที่มา


คำตอบ (3)


สิ่งนี้ควรทำ

<cfset isValidString= true/>
    <cfif REFind("[^[:alnum:]_\.]", arguments.stringToCheck, 1) GT 0>
    <cfset isValidString= false />
</cfif>

การใช้ "isValid" สำหรับชื่อตัวแปรก็ไม่ใช่วิธีปฏิบัติที่ดีเช่นกัน เป็นชื่อของฟังก์ชันใน ColdFusion และอาจทำให้คุณเกิดปัญหาได้สักวันหนึ่ง

person Jason Dean    schedule 21.09.2010
comment
ขอบคุณเจสัน มันใช้งานได้เหมือนระเบิด อย่างน้อยฉันก็สามารถเพิ่มอักขระเพิ่มเติมได้ในตอนนี้หากจำเป็นต้องใช้อักขระ \ เกี่ยวกับ 'isValid' - คุณถูกต้อง 100% เดิมทีมันคือ 'isAlphaNumeric' แต่ฉันคิดว่าจะไม่อยู่ในบริบทอีกต่อไปสำหรับข้อกำหนดของตัวอย่างนี้ ดังนั้นฉันจึงเปลี่ยนมันสำหรับตัวอย่างนี้ทางออนไลน์โดยไม่ต้องคิด! - person Paolo Broccardo; 21.09.2010
comment
คุณไม่จำเป็นต้องใช้ \ ก่อน . และการใช้ \w จะรวม [A-Za-z0-9_] และเป็นเรื่องธรรมดามากกว่า [[:alnum:]] ดังนั้นให้พิจารณาเพียงแค่ [^\w.] แทน - person Peter Boughton; 21.09.2010
comment
สวัสดีปีเตอร์ และรวมถึงขีดล่างด้วย? มันจะเป็น [^\w._] เหรอ? - person Paolo Broccardo; 21.09.2010
comment
\w มีขีดล่างด้วย (มันยังคงใช้งานได้หากคุณระบุอย่างชัดเจน เพียงแต่ไม่จำเป็น) - person Peter Boughton; 21.09.2010
comment
ฉันต้องเว้นวรรคด้วย ดังนั้นฉันจึงปรับแต่งบรรทัดนี้: <cfif REFind("[^[:alnum:] _\.]", arguments.stringToCheck, 1) GT 0> - person HPWD; 10.10.2011

ไม่จำเป็นต้องใช้ cfif - นี่เป็นวิธีที่กระชับที่ดี:

<cfset isValidString = NOT refind( '[^\w.]' , Arguments.StringToCheck )/>


หรือคุณสามารถทำเช่นนี้:

<cfset isValidString = refind( '^[\w.]*$' , Arguments.StringToCheck ) />

(เพื่อป้องกันสตริงว่าง ให้เปลี่ยน * เป็น +)

วิธีนี้สามารถช่วยให้ใช้ข้อจำกัดอื่นๆ ได้ง่ายขึ้น (เช่น ต้องขึ้นต้นด้วยตัวอักษร ฯลฯ) และยังเป็นวิธีที่ตรงไปตรงมามากขึ้นในการแสดงเช็คต้นฉบับอีกด้วย

โปรดทราบว่า ^ ในที่นี้คือจุดยึดที่มีความหมายว่า "จุดเริ่มต้นของบรรทัด/สตริง" (โดยที่ $ เป็นจุดสิ้นสุดที่สอดคล้องกัน) ข้อมูลเพิ่มเติมที่นี่

person Peter Boughton    schedule 21.09.2010
comment
โดยส่วนตัวแล้ว ฉันชอบเขียน a-z0-9 แทนการใช้ \w เพราะมันเป็นการแสดงภาพมากกว่า แต่เป็นคำอธิบายที่ดี - person Ben Doom; 21.09.2010
comment
ไม่ควรเป็น <cfset isValidString = ( refind( '[^\w.]' , Arguments.StringToCheck ) EQ 0 ) /> มิฉะนั้นคุณจะบอกว่าใช้ได้หากมีอักขระ อื่นๆ ที่ไม่ใช่ตัวอักษรและตัวเลขหรือจุด - person Jordan Reiter; 21.09.2010
comment
ขอบคุณจอร์แดน ฉันรู้ว่ามีบางอย่างไม่ถูกต้อง แต่เห็นได้ชัดว่าไม่ได้คิดตรง - ใช่ มันควรจะเป็น ( x EQ 0 ) - หรือเพียงแค่เติมหน้าล็อตด้วย NOT ซึ่งง่ายกว่า/ชัดเจนกว่าอีกครั้ง - person Peter Boughton; 21.09.2010
comment
เบน หากคุณต้องการเพียงตัวพิมพ์เล็กและตัวเลขโดยเฉพาะ [a-z0-9] ก็ใช้ได้ แต่สิ่งสำคัญที่ควรทราบคือ \w คือ [A-Za-z0-9_] และเมื่อนานขนาดนั้น ฉันจะบอกว่า \w ให้ความชัดเจนมากขึ้นทันที - person Peter Boughton; 21.09.2010
comment
โอ้ และเป็นประโยชน์ที่จะรู้ว่าในการใช้งาน regex บางส่วน (แต่ไม่ใช่ CF) \w ยังสามารถรวมอักขระที่มีการเน้นเสียงเช่น áèñôü... ได้ - หากต้องการสิ่งเหล่านี้ \w จะง่ายกว่าแน่นอน แต่แน่นอนว่าหากพวกเขา จึงไม่สะกดตามข้างต้น (ยกเว้น Python ซึ่งมีแฟล็กให้เลือกทางใดทางหนึ่ง) - person Peter Boughton; 21.09.2010

สิ่งนี้จะเหมาะกับคุณหรือไม่?

refind("[\w\d._]","1234abcd._")
person Masterbuddha    schedule 21.09.2010
comment
\w มี \d และ _ อยู่แล้ว และคุณพลาดไปว่า Cheeky กำลังปฏิเสธกลุ่ม (เพื่อระบุสตริงที่ไม่ถูกต้อง) - person Peter Boughton; 21.09.2010