2011-08-12 11 views
10

मुझे language tag के लिए नियमित अभिव्यक्ति की आवश्यकता है जैसा कि BCP 47 द्वारा परिभाषित किया गया है।एक भाषा टैग के लिए नियमित अभिव्यक्ति (जैसा कि बीसीपी 47 द्वारा परिभाषित किया गया है)

मुझे पता है कि पूर्ण बीएनएफ वाक्यविन्यास http://www.rfc-editor.org/rfc/bcp/bcp47.txt पर उपलब्ध है और मैं इसे स्वयं लिखने के लिए उपयोग कर सकता हूं, लेकिन उम्मीद है कि वहां पहले से ही कोई बाहर है।

+0

हाहा। मैंने यह कुछ हफ्ते पहले खुद के लिए किया था, लेकिन दुर्भाग्य से मेरी डिस्क (जो एक ब्रांड नई एसएसडी थी) की मृत्यु हो गई। मैं फिर से एक बार देखूँगा :) – porges

+0

@PaulPRO: भाषा टैग सबसे निश्चित रूप से नियमित हैं। – porges

उत्तर

14

इस तरह लग रहा है:

^((?<grandfathered>(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux| 
i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE)|(art-lojban| 
cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang))|((?<language> 
([A-Za-z]{2,3}(-(?<extlang>[A-Za-z]{3}(-[A-Za-z]{3}){0,2}))?)|[A-Za-z]{4}|[A-Za-z]{5,8}) 
(-(?<script>[A-Za-z]{4}))?(-(?<region>[A-Za-z]{2}|[0-9]{3}))?(-(?<variant>[A-Za-z0-9]{5,8} 
|[0-9][A-Za-z0-9]{3}))*(-(?<extension>[0-9A-WY-Za-wy-z](-[A-Za-z0-9]{2,8})+))* 
(-(?<privateUse>x(-[A-Za-z0-9]{1,8})+))?)|(?<privateUse>x(-[A-Za-z0-9]{1,8})+))$ 

यहाँ कोड यह उत्पन्न करने के लिए (सी # में) है:

var regular = "(art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang)"; 
var irregular = "(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE)"; 
var grandfathered = "(?<grandfathered>" + irregular + "|" + regular + ")"; 
var privateUse = "(?<privateUse>x(-[A-Za-z0-9]{1,8})+)"; 
var singleton = "[0-9A-WY-Za-wy-z]"; 
var extension = "(?<extension>" + singleton + "(-[A-Za-z0-9]{2,8})+)"; 
var variant = "(?<variant>[A-Za-z0-9]{5,8}|[0-9][A-Za-z0-9]{3})"; 
var region = "(?<region>[A-Za-z]{2}|[0-9]{3})"; 
var script = "(?<script>[A-Za-z]{4})"; 
var extlang = "(?<extlang>[A-Za-z]{3}(-[A-Za-z]{3}){0,2})"; 
var language = "(?<language>([A-Za-z]{2,3}(-" + extlang + ")?)|[A-Za-z]{4}|[A-Za-z]{5,8})"; 
var langtag = "(" + language + "(-" + script + ")?" + "(-" + region + ")?" + "(-" + variant + ")*" + "(-" + extension + ")*" + "(-" + privateUse + ")?" + ")"; 
var languageTag = @"^(" + grandfathered + "|" + langtag + "|" + privateUse + ")$"; 

Console.WriteLine(languageTag); 

मैं इसकी सत्यता की गारंटी नहीं दे सकता है (मैं बना दिया है हो सकता है लिखने की त्रुटियों), लेकिन यह काम करता है परिशिष्ट ए में उदाहरणों पर ठीक है

आपके पर्यावरण के आधार पर, आपको नामित कैप्चरिंग समूह "?<...>" को हटाने की आवश्यकता हो सकती है।

+0

बहुत बढ़िया, धन्यवाद! कुछ बदलाव करने के बाद PHP के साथ बढ़िया काम करता है। मैं खुद से पूछ रहा था, 'नामित कैप्चरिंग समूह' क्या करते हैं? जहां तक ​​मुझे पता है, यह PHP की रेगेक्स वाक्यविन्यास में उपलब्ध एक सुविधा नहीं है, लेकिन मुझे बस दिलचस्पी है। –

+1

@Tim यह आपको इंडेक्स के बजाय नाम से समूहों तक पहुंचने की अनुमति देता है। जैसे 'मैच। समूह ["संस्करण"] ' – porges

+1

मुझे नहीं लगता कि यह" नियमित दादा "अनुभागों को ठीक से हल करेगा (उन्हें विशेष कोड के बजाय सामान्य टैग के रूप में पार्स किया जाएगा)। आपको 'langtag' चर से पहले' langtag' चर से पहले 'grandfathered' चर' रखने की आवश्यकता होगी 'भाषाTag' –

2

एक अनुकूलित संस्करण जो PHP में काम करता है।

/^(?<grandfathered>(?:en-GB-oed|i-(?:ami|bnn|default|enochian|hak|klingon|lux|mingo|navajo|pwn|t(?:a[oy]|su))|sgn-(?:BE-(?:FR|NL)|CH-DE))|(?:art-lojban|cel-gaulish|no-(?:bok|nyn)|zh-(?:guoyu|hakka|min(?:-nan)?|xiang)))|(?:(?<language>(?:[A-Za-z]{2,3}(?:-(?<extlang>[A-Za-z]{3}(?:-[A-Za-z]{3}){0,2}))?)|[A-Za-z]{4}|[A-Za-z]{5,8})(?:-(?<script>[A-Za-z]{4}))?(?:-(?<region>[A-Za-z]{2}|[0-9]{3}))?(?:-(?<variant>[A-Za-z0-9]{5,8}|[0-9][A-Za-z0-9]{3}))*(?:-(?<extension>[0-9A-WY-Za-wy-z](?:-[A-Za-z0-9]{2,8})+))*)(?:-(?<privateUse>x(?:-[A-Za-z0-9]{1,8})+))?$/Di 
संबंधित मुद्दे