मैं कभी-कभी व्हॉट्सएप का मिलान करना चाहता हूं लेकिन न्यूलाइन का नहीं।
अब तक मैं इसका सहारा ले रहा हूं [ \t]
। क्या कम अजीब तरीका है?
मैं कभी-कभी व्हॉट्सएप का मिलान करना चाहता हूं लेकिन न्यूलाइन का नहीं।
अब तक मैं इसका सहारा ले रहा हूं [ \t]
। क्या कम अजीब तरीका है?
जवाबों:
पर्ल संस्करण 5.10 और बाद में सहायक ऊर्ध्वाधर और क्षैतिज चरित्र वर्गों का समर्थन करता है, \v
और \h
साथ ही सामान्य व्हाट्सएप चरित्र वर्ग\s
सबसे साफ समाधान क्षैतिज व्हाट्सएप चरित्र वर्ग का उपयोग करना है \h
। यह ASCII सेट से टैब और स्थान से मेल खाएगा, विस्तारित ASCII से गैर-ब्रेकिंग स्पेस, या इनमें से कोई भी यूनिकोड वर्ण
U+0009 CHARACTER TABULATION
U+0020 SPACE
U+00A0 NO-BREAK SPACE (not matched by \s)
U+1680 OGHAM SPACE MARK
U+2000 EN QUAD
U+2001 EM QUAD
U+2002 EN SPACE
U+2003 EM SPACE
U+2004 THREE-PER-EM SPACE
U+2005 FOUR-PER-EM SPACE
U+2006 SIX-PER-EM SPACE
U+2007 FIGURE SPACE
U+2008 PUNCTUATION SPACE
U+2009 THIN SPACE
U+200A HAIR SPACE
U+202F NARROW NO-BREAK SPACE
U+205F MEDIUM MATHEMATICAL SPACE
U+3000 IDEOGRAPHIC SPACE
ऊर्ध्वाधर अंतरिक्ष पैटर्न \v
कम उपयोगी है, लेकिन इन से मेल खाता है
U+000A LINE FEED
U+000B LINE TABULATION
U+000C FORM FEED
U+000D CARRIAGE RETURN
U+0085 NEXT LINE (not matched by \s)
U+2028 LINE SEPARATOR
U+2029 PARAGRAPH SEPARATOR
सात वर्टिकल व्हॉट्सएप अक्षर हैं जो मेल खाते हैं \v
और अठारह क्षैतिज होते हैं जो मेल खाते हैं \h
। \s
तेईस अक्षरों से मेल खाता है
सभी व्हाट्सएप पात्र या तो ऊर्ध्वाधर या क्षैतिज हैं जिनमें कोई ओवरलैप नहीं है, लेकिन वे उचित उपसमूह नहीं हैं, क्योंकि \h
यह U + 00A0 NO-BREAK SPACE से \v
भी मेल खाता है , और U + 0085 NEXT LINE से भी मेल खाता है, जिनमें से किसी से भी मिलान नहीं किया गया है\s
\h
केवल उन भाषाओं पर काम करता है जो समर्थन करती हैं PCRE
।
[[:blank:]]
कोई ब्रेक अंतरिक्ष से मेल नहीं खाता -
या"\xA0"
\h
मेरे उपयोग के मामले के लिए पूरी तरह से काम किया है जो 1 या अधिक सन्निहित गैर-नई-रिक्त स्थान पर Notepad ++ में एक खोज / प्रतिस्थापित कर रहा था। और कुछ नहीं (सरल) काम किया।
\h
थोड़ा अमानक का समावेश है MONGOLIAN VOWEL SEPARATOR
। यूनिकोड इसे व्हॉट्सएप नहीं मानता। उस कारण से, पर्ल \h
POSIX blank
( [[:blank:]]
पर्ल में, \p{Blank}
जावा में) और जावा 8 से अलग है \h
। बेशक, यह एक किनारे का मामला है।
एक दोहरे नकारात्मक का उपयोग करें:
/[^\S\r\n]/
यानी नॉट-व्हाट्सएप (कैपिटल एस कंपल्स) या कैरिज-रिटर्न या नॉट-न्यूलाइन। डी मॉर्गन के कानून के साथ बाहरी नहीं ( यानी , ^
चरित्र वर्ग में पूरक ) वितरित करना , यह "व्हाट्सएप के बराबर है, लेकिन गाड़ी वापसी या न्यूलाइन नहीं।" दोनों को शामिल करना और पैटर्न में सही ढंग से यूनिक्स (एलएफ), क्लासिक मैक ओएस (सीआर), और डॉस-ईश (सीआर एलएफ) न्यूलाइन सम्मेलनों को शामिल किया गया है ।\r
\n
इसके लिए मेरा शब्द लेने की आवश्यकता नहीं:
#! /usr/bin/env perl
use strict;
use warnings;
use 5.005; # for qr//
my $ws_not_crlf = qr/[^\S\r\n]/;
for (' ', '\f', '\t', '\r', '\n') {
my $qq = qq["$_"];
printf "%-4s => %s\n", $qq,
(eval $qq) =~ $ws_not_crlf ? "match" : "no match";
}
आउटपुट:
"" => मैच "एफ़" => मैच "टी / टी" => मैच "ए आर" => कोई मेल नहीं "n +" => कोई मेल नहीं
ऊर्ध्वाधर टैब के बहिष्करण पर ध्यान दें, लेकिन यह v5.18 में संबोधित किया गया है ।
बहुत कठोर रूप से आपत्ति करने से पहले, पर्ल प्रलेखन उसी तकनीक का उपयोग करता है। पेरेलेचारक्लास के "व्हाट्सएप" खंड में एक फुटनोट पढ़ता है
Perl v5.18 से पहले,
\s
ऊर्ध्वाधर टैब से मेल नहीं खाता था।[^\S\cK]
(अस्पष्ट रूप से)\s
पारंपरिक रूप से जो किया जाता है उससे मेल खाता है ।
पर्लेक्रेक्लास का एक ही खंड अन्य दृष्टिकोणों का भी सुझाव देता है जो भाषा शिक्षकों के दोहरे-नकारात्मक विरोध का सामना नहीं करेंगे।
लोकल और यूनिकोड नियमों के बाहर या जब /a
स्विच प्रभावी होता है, " \s
मिलान [\t\n\f\r ]
और, ऊर्ध्वाधर टैब में शुरू, ऊर्ध्वाधर टैब \cK
।" व्हाट्सएप \r
का मिलान \n
करने के /[\t\f\cK ]/
लिए त्यागें और छोड़ें लेकिन न्यूलाइन नहीं।
यदि आपका पाठ यूनिकोड है, तो उपरोक्त दस्तावेज खंड में तालिका से पैटर्न बनाने के लिए उप के समान कोड का उपयोग करें ।
sub ws_not_nl {
local($_) = <<'EOTable';
0x0009 CHARACTER TABULATION h s
0x000a LINE FEED (LF) vs
0x000b LINE TABULATION vs [1]
0x000c FORM FEED (FF) vs
0x000d CARRIAGE RETURN (CR) vs
0x0020 SPACE h s
0x0085 NEXT LINE (NEL) vs [2]
0x00a0 NO-BREAK SPACE h s [2]
0x1680 OGHAM SPACE MARK h s
0x2000 EN QUAD h s
0x2001 EM QUAD h s
0x2002 EN SPACE h s
0x2003 EM SPACE h s
0x2004 THREE-PER-EM SPACE h s
0x2005 FOUR-PER-EM SPACE h s
0x2006 SIX-PER-EM SPACE h s
0x2007 FIGURE SPACE h s
0x2008 PUNCTUATION SPACE h s
0x2009 THIN SPACE h s
0x200a HAIR SPACE h s
0x2028 LINE SEPARATOR vs
0x2029 PARAGRAPH SEPARATOR vs
0x202f NARROW NO-BREAK SPACE h s
0x205f MEDIUM MATHEMATICAL SPACE h s
0x3000 IDEOGRAPHIC SPACE h s
EOTable
my $class;
while (/^0x([0-9a-f]{4})\s+([A-Z\s]+)/mg) {
my($hex,$name) = ($1,$2);
next if $name =~ /\b(?:CR|NL|NEL|SEPARATOR)\b/;
$class .= "\\N{U+$hex}";
}
qr/[$class]/u;
}
अल्फ़ाबेटिक वर्णों के मिलान के लिए भी डबल-नेगेटिव ट्रिक बहुत आसान है। याद रखें कि \w
"शब्द वर्ण," वर्णमाला वर्ण और अंक और अंडरस्कोर से मेल खाता है । हम बदसूरत-अमेरिकी कभी-कभी इसे लिखना चाहते हैं, कहते हैं,
if (/[A-Za-z]+/) { ... }
लेकिन एक दोहरे-नकारात्मक चरित्र-वर्ग लोकेल का सम्मान कर सकते हैं:
if (/[^\W\d_]+/) { ... }
"एक शब्द चरित्र लेकिन अंक या अंडरस्कोर नहीं" व्यक्त करना इस तरह से थोड़ा अपारदर्शी है। एक POSIX चरित्र-वर्ग इरादे को और अधिक सीधे संवाद करता है
if (/[[:alpha:]]+/) { ... }
या यूनिकोड संपत्ति के साथ जैसा कि szbalint ने सुझाव दिया है
if (/\p{Letter}+/) { ... }
\r
, उदाहरण के लिए विंडोज पर, इसलिए मैच से उन्हें बाहर करने पर भी विचार करें /[^\S\r\n]/
) :
\h
उपलब्ध होने पर इस समाधान का उपयोग करने के लिए बस कोई बहाना नहीं है।
ग्रेग के जवाब पर एक बदलाव जिसमें गाड़ी के रिटर्न भी शामिल हैं:
/[^\S\r\n]/
यह रेगेक्स /[^\S\n]/
नहीं की तुलना में सुरक्षित है \r
। मेरा तर्क यह है कि Windows \r\n
नईलाइन्स के लिए उपयोग करता है, और मैक ओएस 9 का उपयोग करता है \r
। आप आजकल \r
बिना \n
पाए जाने की संभावना नहीं है, लेकिन यदि आप इसे ढूंढते हैं, तो इसका मतलब कुछ भी नहीं हो सकता है, लेकिन यह एक नई पंक्ति है। इस प्रकार, चूंकि \r
एक नई रूपरेखा का मतलब हो सकता है, हमें इसे भी बाहर करना चाहिए।
नीचे रेगेक्स सफेद रिक्त स्थान से मेल खाएगा, लेकिन एक नई लाइन चरित्र का नहीं।
(?:(?!\n)\s)
अगर आप कैरेज रिटर्न भी जोड़ना चाहते हैं तो निगेटिव लुकहेड के अंदर ऑपरेटर के \r
साथ जोड़ें |
।
(?:(?![\n\r])\s)
जोड़े +
गैर कैप्चरिंग समूह के बाद एक या अधिक सफेद रिक्त स्थान मैच के लिए।
(?:(?![\n\r])\s)+
मुझे नहीं पता कि आप लोग POSIX वर्ण वर्ग का उल्लेख करने में विफल रहे [[:blank:]]
जो किसी भी क्षैतिज व्हाट्सएप ( स्थान और टैब ) से मेल खाता है । यह POSIX क्रैकर क्लास BRE ( बेसिक रेगलर एक्सप्रेशंस ), ERE ( एक्सटेंडेड रेगुलर एक्सप्रेशन ), PCRE ( पर्ल कम्पेटिबल रेगुलर एक्सप्रेशन ) पर काम करेगा।
आप जो देख रहे हैं वह POSIX blank
वर्ण वर्ग है। पर्ल में इसका उल्लेख है:
[[:blank:]]
जावा में (सक्षम करने के लिए मत भूलना UNICODE_CHARACTER_CLASS
):
\p{Blank}
इसी तरह की तुलना में \h
, POSIX blank
कुछ और रेगेक्स इंजन ( संदर्भ ) द्वारा समर्थित है । एक प्रमुख लाभ यह है कि इसकी परिभाषा एनेक्सी सी में तय की गई है: यूनिकोड नियमित अभिव्यक्तियों की संगतता गुण और यूनिकोड का समर्थन करने वाले सभी रेगेक्स फ्लेवर के मानक। (पर्ल में, उदाहरण के लिए, \h
इसके अतिरिक्त चुनना शामिल है MONGOLIAN VOWEL SEPARATOR
।) हालांकि, इसके पक्ष में एक तर्क \h
यह है कि यह हमेशा यूनिकोड वर्णों का पता लगाता है (भले ही इंजन जिस पर सहमत न हों), जबकि POSIX चरित्र वर्ग अक्सर डिफ़ॉल्ट ASIII द्वारा होते हैं। -ऑनली (जैसा कि जावा में है)।
लेकिन समस्या यह है कि यहां तक कि यूनिकोड से चिपके रहने से समस्या 100% हल नहीं होती है। निम्नलिखित पात्रों पर विचार करें जिन्हें यूनिकोड में व्हॉट्सएप नहीं माना जाता है:
U + 180E मंगोलियन VOWEL SEPARATOR
यू + 200 बी शून्य शून्य अंतरिक्ष
यू + 200 सी शून्य शून्य नॉन-जॉयनर
यू + 200 डी जीरो विडिट जॉयनर
U + 2060 WORD JOINER
U + FEFF ZERO WIDTH NON-BREAKING SPACE
Https://en.wikipedia.org/wiki/White-space_character से लिया गया
उपर्युक्त मंगोलियाई स्वर विभाजक के लिए शामिल नहीं है जो शायद एक अच्छा कारण है। यह 200C और 200D के साथ, शब्दों (AFAIK) के भीतर होता है, और इसलिए कार्डिनल नियम को तोड़ता है जो अन्य सभी व्हाट्सएप का पालन करता है: आप इसके साथ टोकन कर सकते हैं। वे संशोधक की तरह अधिक हैं। हालांकि, ZERO WIDTH SPACE
, WORD JOINER
, और ZERO WIDTH NON-BREAKING SPACE
(अगर यह एक बाइट क्रम के निशान के अलावा अन्य के रूप में इस्तेमाल) मेरी किताब में खाली स्थान के नियम फिट। इसलिए, मैं उन्हें अपने क्षैतिज व्हाट्सएप चरित्र वर्ग में शामिल करता हूं।
जावा में:
static public final String HORIZONTAL_WHITESPACE = "[\\p{Blank}\\u200B\\u2060\\uFFEF]"
perl
मूल प्रश्न में टैग क्या अपरिपक्व है ।
[\p{Blank}\u200b\u180e]
आवश्यकता होती है। बेशक, यह समझ में आता है कि एक स्वर विभाजक को एक व्हाट्सएप चरित्र नहीं माना जाता है, लेकिन क्यों शून्य-चौड़ाई अंतरिक्ष जैसी कक्षाओं में नहीं है \s
और \p{Blank}
, मुझे मारता है।
m/ /g
बस में जगह दे / /
और यह काम करेगा। या उपयोग \S
- यह टैब, newlines, रिक्त स्थान और इतने पर जैसे सभी विशेष वर्णों को प्रतिस्थापित करेगा।
[\r\f]
:।