2011-02-11 8 views
16

मैं एक यूआरएल का परीक्षण करना चाहता हूं जो में समाप्त नहीं होता है। एचटीएमएलनियमित अभिव्यक्ति: केवल तभी मिलान करना जब विशेष अनुक्रम में समाप्त न हो

यह वह पैटर्न है जिसके साथ मैं आया हूं:

[/\w\.-]+[^\.html$] 

निम्न मिलान क्योंकि यह में समाप्त नहीं होता है। एचटीएमएल

/blog/category/subcategory/ 

यह मेल नहीं खाता क्योंकि यह में समाप्त होता है। एचटीएमएल:

/blog/category/subcategory/index.html 

हालांकि, निम्न मेल नहीं खाता है, हालांकि मैं इसे मिलान करना चाहता हूं, क्योंकि यह में समाप्त होता है। और नहीं .html

/blog/category/subcategory/index.ht 

मुझे अपना पैटर्न कैसे बदलना चाहिए?

+1

आप किस प्रोग्रामिंग भाषा या उपकरण का उपयोग कर रहे हैं? –

उत्तर

33

आप अपने नियमित अभिव्यक्ति इंजन इसका समर्थन करता है, तो एक नकारात्मक lookbehind दावे का उपयोग कर सकते हो जाता है:

^[/\w\.-]+(?<!\.html)$ 

आप lookbehind दावे नहीं है, तो लेकिन आप lookaheads तो आप की क्या ज़रूरत है इसके बजाय उसका उपयोग कर सकते हैं:

^(?!.*\.html$)[/\w\.-]+$ 

ऑनलाइन काम कर यह देखें: rubular

+0

@ खनल: मुझे उम्मीद है कि यह इंजन पर और आपके इनपुट स्ट्रिंग के वितरण पर निर्भर करता है। –

17

आप किस इंजन का उपयोग कर रहे हैं? यदि यह एक है कि अग्रदर्शी दावे का समर्थन करता है, तो आप निम्न कर सकते हैं:

/((?!\.html$)[/\w.-])+/ 

यदि हम यह घटकों में बाहर तोड़, यह इस तरह दिखता है:

(   # start a group for the purposes of repeating 
(?!\.html$) # negative lookahead assertion for the pattern /\.html$/ 
[/\w.-]  # your own pattern for matching a URL character 
)+   # repeat the group 

इसका मतलब है कि, हर चरित्र के लिए, यह परीक्षण करता है कि चरित्र का उपभोग करने से पहले पैटर्न /.html$/ यहां मेल नहीं खा सकता है।

आप पूरे पैटर्न को ^ और शुरुआत में $ के साथ पूरे यूआरएल से मेल करने के लिए मजबूर करने के लिए मजबूर कर सकते हैं - अन्यथा यह केवल यूआरएल के एक हिस्से से मेल खाता है। इस बदलाव के साथ, यह

/^((?!\.html$)[/\w.-])+$/ 
संबंधित मुद्दे