2013-02-01 4 views
7

में बैकस्लैश की अनुमति देने के लिए नियमित अभिव्यक्ति क्या कोई मुझे स्ट्रिंग को सत्यापित करने के लिए रेगेक्स प्रदान कर सकता है जो केवल बैकस्लैश को छोड़कर किसी विशेष वर्ण को अनुमति नहीं देनी चाहिए। मैंसी #

var regexItem = new Regex("^[a-zA-Z0-9\\\ ]*$"); 

की कोशिश की लेकिन यह आप या तो इसे से बचने के (एक बार सी # के लिए और एक बार Regex इंजन के लिए) को दोगुना करने की जरूरत है

+3

"काम नहीं लग रहा है" मतलब है? ऐसा क्या करता है कि आप उम्मीद नहीं करते? –

उत्तर

8

काम करने के लिए प्रतीत नहीं होता है: या

var regexItem = new Regex("^[a-zA-Z0-9\\\\ ]*$"); 

आप कर सकते हैं (ध्यान दें @) का उपयोग सी के verbatim string feature #:

var regexItem = new Regex(@"^[a-zA-Z0-9\\ ]*$"); 

शब्दशः स्ट्रिंग में बैकस्लैश नहीं interpre एक भागने अनुक्रम शुरू करने के रूप में ted, तो आप Regex इंजन के लिए एक बार इसे बचने की जरूरत है।

मुझे लगता है कि आपका वर्तमान कोड संकलित नहीं है। इसे "अज्ञात भागने अनुक्रम" की रेखाओं के साथ कुछ कहना चाहिए।
इसका कारण यह है कि आपके पास तीन बैकस्लैश हैं जिसके बाद एक स्पेस है। पहले दो बैकस्लाश को बैकस्लैश का प्रतिनिधित्व करने वाले एस्केप अनुक्रम के रूप में व्याख्या किया जाता है, लेकिन तीसरे बैकस्लैश को दूसरे चरित्र के रूप में एक अंतरिक्ष के साथ एक भागने अनुक्रम शुरू करने के रूप में व्याख्या किया जाता है। इस तरह के एक बचने का अनुक्रम मौजूद नहीं है, जिससे त्रुटि उत्पन्न होती है।

0

आप एक ही \ मिलान के लिए \s जोड़कर regex के लिए \ के साथ ही सी # स्ट्रिंग से बचने के लिए होगा।

17

बैकस्लाश को नियमित अभिव्यक्तियों में भागने की आवश्यकता है - और भी को सी # में भागने की आवश्यकता है, जब तक कि आप verbatim string literals का उपयोग न करें। तो इनमें से किसी काम करना चाहिए:

var regexItem = new Regex(@"^[a-zA-Z0-9\\ ]*$"); 
var regexItem = new Regex("^[a-zA-Z0-9\\\\ ]*$"); 

इन दोनों यह सुनिश्चित करें कि निम्न स्ट्रिंग सामग्री Regex निर्माता को पारित कर दिया है:

^[a-zA-Z0-9\\ ]*$ 

Regex कोड तो डबल बैकस्लैश देख सकते हैं और के रूप में यह व्यवहार करेगा "मैं वास्तव में बैकस्लैश चरित्र से मेल खाना चाहता हूं।"

असल में, आपको हमेशा "स्ट्रिंग सामग्री जो आप रेगेक्स इंजन में पास करना चाहते हैं" और "स्रोत कोड में स्ट्रिंग शाब्दिक प्रतिनिधित्व" के बीच अंतर करने की आवश्यकता है। (यह निश्चित रूप से, न सिर्फ नियमित अभिव्यक्ति के लिए सच है डिबगर घड़ी खिड़कियों आदि में से बचने के द्वारा मदद नहीं करता है।)

संपादित करें: अब यह सवाल पता चलता है कि आप मूल रूप से तीन बैकस्लैश था संपादित किया गया है , यह सिर्फ वैध सी # नहीं है। मैं आप "में तीन बैकस्लैश के साथ एक स्ट्रिंग" के लिए लक्ष्य कर रहे थे पर शक जो इनमें से किसी होगा:

var regexItem = new Regex(@"^[a-zA-Z0-9\\\ ]*$"); 
var regexItem = new Regex("^[a-zA-Z0-9\\\\\\ ]*$"); 

... लेकिन आप अंतरिक्ष से बचने के लिए जहाँ तक रेगुलर एक्सप्रेशन है की जरूरत नहीं है चिंतित।

+0

कृपया ध्यान दें कि Regex ctor को कुछ भी पास नहीं किया गया है, क्योंकि कोड संकलित नहीं करता है। –

+1

@DanielHilgarth: आपके द्वारा संपादित किए जाने से पहले संकलित किए गए कोड में * दिखाया गया कोड।(जब मैंने सवाल का जवाब दिया, तो सवाल ने दो बैकस्लेश दिखाए। कोड शैली में नहीं, और मैं समझता हूं कि मार्कडाउन में तीन बैकस्लेश थे, लेकिन मैंने जो सवाल देखा वह जवाब दे रहा था :) –

+0

मैंने केवल कोड को स्वरूपित किया। मूल संशोधन के स्रोत पर एक नज़र डालें। शुरुआत से तीन बैकस्लेश थे। –