2010-04-08 27 views
10

के विशेष संयोजन के साथ नहीं, मान लें कि जावास्क्रिप्ट का उपयोग करके, मैं [abcde]* के साथ समाप्त होने वाली स्ट्रिंग से मेल खाना चाहता हूं लेकिन abc के साथ नहीं।कुछ वर्णों के साथ समाप्त होने वाली स्ट्रिंग से मेल खाने के लिए जावास्क्रिप्ट रेगेक्स, लेकिन

तो रेगेक्स xxxa, xxxbc, xxxabd से मेल खाना चाहिए लेकिन xxxabc नहीं होना चाहिए।

मैं पूरी तरह उलझन में हूं।

संपादित करें: मैं किसी कारण से regex का उपयोग करने के लिए है, मैं कुछ if (str.endsWith("abc"))

+0

'[abcde] *' वास्तव में होना चाहिए '[abcde]'? अन्यथा 'xxx' मैच ठीक है। – polygenelubricants

उत्तर

25

समाधान सरल है: नकारात्मक अग्रदर्शी का उपयोग करें:

(?!.*abc$) 

यह दावा है कि स्ट्रिंग abc साथ अंत नहीं है।

आपने बताया कि आपको [abcde]* के साथ समाप्त करने के लिए स्ट्रिंग की भी आवश्यकता है, लेकिन * का अर्थ है कि यह वैकल्पिक है, इसलिए xxx मैचों। मुझे लगता है कि आप वास्तव में [abcde]+ चाहते हैं, जिसका अर्थ यह भी है कि इसे [abcde] के साथ समाप्त करने की आवश्यकता है। उस मामले में, कथनों हैं:

(?=.*[abcde]$)(?!.*abc$) 

सकारात्मक और नकारात्मक lookarounds पर ट्यूटोरियल के लिए regular-expressions.info देखें।


मैं के बाद से मैं (भाषा से परिचित हालांकि मुझे विश्वास है कि दावे, यदि समर्थित, काम करेगा था नहीं कर रहा हूँ वास्तविक जावास्क्रिप्ट regex देने के लिए अनिच्छुक था - regular-expressions.info के अनुसार, जावास्क्रिप्ट सकारात्मक और नकारात्मक का समर्थन करता है भविष्य का ध्यान करना)।नुकीले और एलन मूर की टिप्पणी के लिए धन्यवाद, मुझे लगता है कि उचित जावास्क्रिप्ट regex यह है:

var regex = /^(?!.*abc$).*[abcde]$/; 

ध्यान दें कि यह संस्करण (एलन मूर को ऋण के साथ) नहीं रह गया है सकारात्मक अग्रदर्शी की जरूरत है। यह बस .*[abcde]$ से मेल खाता है, लेकिन पहले ^(?!.*abc$) पर जोर देता है।

+0

यह काम नहीं करता है। इसे जावास्क्रिप्ट में आज़माएं - दूसरा रेगेक्स "xxabc" मिलान करता है। – Pointy

+0

@ पॉइंटी: '" xxabc ".matches (" (? =। * [Abcde] $) (?!। * Abc $)। * ") जावा में' false' है; मैं मानता हूं कि मैं किसी भी विशेष जावास्क्रिप्ट स्वाद से परिचित नहीं हूं, लेकिन अगर यह सकारात्मक और नकारात्मक दिखने का समर्थन करता है, तो रेगेक्स को काम करना चाहिए। – polygenelubricants

+0

@Pointy: '" xxabc ".match (/^(? =। * [Abcde] $) (?!। * Abc $)। * $ /) जावास्क्रिप्ट में' शून्य 'है (हालांकि मुझे यकीन नहीं है अगर यह इस भाषा में regex करने का सही तरीका है)। – polygenelubricants

0

हम्म ऐसा नहीं कर सकते ...

var regex = /(ab[abde]|[abcde])$/; // wrong 

शायद? इंतजार नहीं; पर पकड़:

var regex = /(ab[abde]|([^a].|.[^b])[abcde]|\b.?[abcde])$/; 

ताकि "ab" "एक" के बाद है, "ख", "डी", या "ई"; या कोई भी दो-चरित्र अनुक्रम जहां पहला चरित्र "ए" नहीं है या दूसरा अक्षर "बी" नहीं है, उसके बाद "ए" के माध्यम से "ई" होता है; या किसी भी शब्द सीमा के बाद किसी भी चरित्र (संभवतः) "ए" के माध्यम से "ई" के बाद। अंतिम खंड छोटे तारों से निपटने के लिए है; यह धोखाधड़ी का प्रकार है लेकिन इस मामले में यह काम करता है।

2

सबसे पहले, प्रत्येक स्ट्रिंग [abcde]* के साथ समाप्त होता है, क्योंकि यह शून्य चौड़ाई की अनुमति देता है। इस प्रकार हम वास्तव में केवल एक रेगेक्स की तलाश में हैं जो तारों से मेल खाता है जो abc में समाप्त नहीं होते हैं। आसान।

([^c]|[^b]c|[^a]bc)$ 

कुछ है कि c नहीं है, कुछ है कि c द्वारा पीछा नहीं b, या कुछ और है कि bc द्वारा पीछा नहीं a, और जो भी उन लोगों में से विकल्प नहीं है यही कारण है, तो स्ट्रिंग के अंत के बाद।

15

या तो सवाल ठीक तरह से परिभाषित नहीं किया गया है, या हर कोई एक साधारण जवाब देख रहा है।

var re = /abc$/; 

!re.test("xxxa"); // pass 
!re.test("xxxbc"); // pass 
!re.test("xxxabd"); // pass 
!re.test("xxxabc"); // fail 

इन अंत के सभी /[abcde]*/

+0

सरल, चालाक। बस अंतिम चार और 'और' बूलियन परिणामों के लिए भी परीक्षण करें। – Kangur

+0

सहमत हैं, बहुत आसान है, लेकिन मेरे [उपयोग के मामले] के लिए (http://stackoverflow.com/a/26555116/1008999) शुरुआत में '!' के साथ काम नहीं करेगा – Endless

1

में बस @ Macek के लिए कहने के लिए आप जवाब है कि सरल और शुरुआत में ! साथ स्पष्ट है चाहता हूँ लेकिन मैं वास्तव में ऑपरेटर नहीं चाहता था regexp के अंदर होने के लिए तो मैं जैसे के साथ इसे इस्तेमाल कर सकते हैं:

: Array::some, Array::filter, Array::find, Array::findIndex और एक समारोह या एक छलबल पाश

यहाँ बनाए बिना एक उदाहरण है

var items = ["ja", "ka", "mf", "bg", "vb", "b"] 
 
var regex = /^((?!a$|b$).)*$/; // match a string that doesn't end with a or b 
 

 
var matched = items.filter(RegExp.prototype.test, regex); 
 

 
alert(matched); // result: ["mf", "bg"]

संबंधित मुद्दे

 संबंधित मुद्दे