व्हॉट्सएप का मिलान करें, लेकिन नए सिरे से नहीं


277

मैं कभी-कभी व्हॉट्सएप का मिलान करना चाहता हूं लेकिन न्यूलाइन का नहीं।

अब तक मैं इसका सहारा ले रहा हूं [ \t]। क्या कम अजीब तरीका है?


4
BTW, ये वर्ण "व्हाट्सएप" भी हैं [\r\f]:।
यूजीन यमश

2
@eugeney क्या कोई अभी भी फॉर्म फीड कर रहा है? ((f's)
अरन मुल्होलैंड

1
@AranMulholland: कोई भी व्यक्ति जिसके पास वर्ण-उन्मुख प्रिंटर है। अधिकांश प्रिंटर में एक चरित्र मोड के साथ-साथ पोस्टस्क्रिप्ट या जो भी हेवलेट पैकार्ड इंटरफ़ेस कहा जाता है, और एक पृष्ठ फेंकने के लिए आप एक फॉर्म फ़ीड भेजते हैं।
बोरोदिन

1
@ बोरोडिन हेवलेट पैकर्ड्स को पीसीएल (प्रिंटर कंट्रोल लैंग्वेज) कहा जाता है।
CB_Ron

जवाबों:


182

पर्ल संस्करण 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


7
\hकेवल उन भाषाओं पर काम करता है जो समर्थन करती हैं PCRE
अविनाश राज

14
@AvinashRaj: यह सवाल पर्ल, जो निश्चित रूप से PCRE का समर्थन करता है के बारे में है
Borodin

2
@AvinashRaj: सिवाय कि [[:blank:]]कोई ब्रेक अंतरिक्ष से मेल नहीं खाता -  या"\xA0"
Borodin

6
वाना उल्लेख है कि \hमेरे उपयोग के मामले के लिए पूरी तरह से काम किया है जो 1 या अधिक सन्निहित गैर-नई-रिक्त स्थान पर Notepad ++ में एक खोज / प्रतिस्थापित कर रहा था। और कुछ नहीं (सरल) काम किया।
स्क्वीडब

8
क्या पर्ल के बनाता है \hथोड़ा अमानक का समावेश है MONGOLIAN VOWEL SEPARATOR। यूनिकोड इसे व्हॉट्सएप नहीं मानता। उस कारण से, पर्ल \hPOSIX blank( [[:blank:]]पर्ल में, \p{Blank}जावा में) और जावा 8 से अलग है \h। बेशक, यह एक किनारे का मामला है।
अलेक्सांद्र डबिन्सकी

362

एक दोहरे नकारात्मक का उपयोग करें:

/[^\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}+/) { ... }

4
चतुर, लेकिन व्यवहार बहुत आश्चर्य की बात है, और मैं नहीं देखता कि यह कैसे कम अजीब है।
16 अक्टूबर को क्वर्टी

7
@ क्वर्टी: क्या आश्चर्य की बात है? इससे कम अजीब क्या है?
ysth

9
बहुत ही भयानक।

9
यह बहुत अच्छा है। जैसा कि अनुरोध किया गया है, आप व्हाट्सएप से मेल खाते हैं (न केवल कुछ व्हाट्सएप वर्ण), और आप लाइन फीड वर्ण को बाहर करते हैं। आपका समाधान इस सवाल के साथ खुद को चिंतित नहीं करता है: "व्हाट्सएप वर्ण मौजूद हैं", जैसा कि यह नहीं होना चाहिए। यह वही है जो मैं देख रहा था। (जैसा कि @Rory द्वारा बताया गया है, एक 'न्यूलाइन' भी शामिल हो सकती है \r, उदाहरण के लिए विंडोज पर, इसलिए मैच से उन्हें बाहर करने पर भी विचार करें /[^\S\r\n]/) :
टिमो

1
यह निश्चित रूप से ओपी की जरूरतों को पूरा करेगा और वस्तुतः बाकी सभी लोग जो इस प्रश्न को खोजते हैं (अंग्रेजी बोलने वाले, वैसे भी)। लेकिन यह अभी भी एक बुरा जवाब है। \hउपलब्ध होने पर इस समाधान का उपयोग करने के लिए बस कोई बहाना नहीं है।
एलन मूर

49

ग्रेग के जवाब पर एक बदलाव जिसमें गाड़ी के रिटर्न भी शामिल हैं:

/[^\S\r\n]/

यह रेगेक्स /[^\S\n]/नहीं की तुलना में सुरक्षित है \r। मेरा तर्क यह है कि Windows \r\nनईलाइन्स के लिए उपयोग करता है, और मैक ओएस 9 का उपयोग करता है \r। आप आजकल \rबिना \nपाए जाने की संभावना नहीं है, लेकिन यदि आप इसे ढूंढते हैं, तो इसका मतलब कुछ भी नहीं हो सकता है, लेकिन यह एक नई पंक्ति है। इस प्रकार, चूंकि \rएक नई रूपरेखा का मतलब हो सकता है, हमें इसे भी बाहर करना चाहिए।


1
+1 ग्रेग के समाधान ने मेरे पाठ को दूषित कर दिया, आपका काम ठीक रहा।
टिमो हुओवेनन

आपको आश्चर्य हो सकता है कि कितने कार्यक्रम अभी भी लाइन एंडिंग के लिए "\ r" का उपयोग करते हैं। कभी-कभी मुझे यह पता लगाने में थोड़ा समय लगता था कि मेरी समस्या यह थी कि फ़ाइल इनका उपयोग करती थी। या कि यह MacRoman चरित्र एन्कोडिंग का इस्तेमाल किया ...
20:13 पर

2
ऐसा लगता है जैसे @Greg ने पहले इसे "गलत" किया और इसे बदल दिया और आपको इसका श्रेय नहीं दिया। Thats क्यों यहाँ upvoting im।
आंद्रे एल्रिको

14

नीचे रेगेक्स सफेद रिक्त स्थान से मेल खाएगा, लेकिन एक नई लाइन चरित्र का नहीं।

(?:(?!\n)\s)

डेमो

अगर आप कैरेज रिटर्न भी जोड़ना चाहते हैं तो निगेटिव लुकहेड के अंदर ऑपरेटर के \rसाथ जोड़ें |

(?:(?![\n\r])\s)

डेमो

जोड़े +गैर कैप्चरिंग समूह के बाद एक या अधिक सफेद रिक्त स्थान मैच के लिए।

(?:(?![\n\r])\s)+

डेमो

मुझे नहीं पता कि आप लोग POSIX वर्ण वर्ग का उल्लेख करने में विफल रहे [[:blank:]]जो किसी भी क्षैतिज व्हाट्सएप ( स्थान और टैब ) से मेल खाता है । यह POSIX क्रैकर क्लास BRE ( बेसिक रेगलर एक्सप्रेशंस ), ERE ( एक्सटेंडेड रेगुलर एक्सप्रेशन ), PCRE ( पर्ल कम्पेटिबल रेगुलर एक्सप्रेशन ) पर काम करेगा।

डेमो


यह सबसे अच्छा उपाय है!
लोरेटोपरसी

13

आप जो देख रहे हैं वह 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]"

आपको जावा संकलन के लिए उपयुक्त रेगेक्स कंपाइल झंडे जोड़ने की जरूरत है, और जावा 7 या बाद में चल रहा है। किसी भी घटना में, सवाल जावा या पीसीआरई के बारे में बिल्कुल नहीं था, इसलिए यह सब सारहीन है।
tchrist

@tchrist इसे इंगित करने के लिए धन्यवाद। मैं अपना जवाब अपडेट करूंगा। मैं असहमत हूं, हालांकि, मेरा जवाब अप्रासंगिक है। perlमूल प्रश्न में टैग क्या अपरिपक्व है ।
अलेक्जेंडर डबलिनस्की

1
@AleksandrDubinsky, \ p {Blank} जावास्क्रिप्ट में समर्थित नहीं है, इसलिए निश्चित रूप से "सभी regex जायके के लिए मानक नहीं" -1
वैलेंटाइन वासिलीव

सबसे अधिक जानकारीपूर्ण। मुझे यह जानना विचलित लगता है कि एक सामान्य और पूर्ण "क्षैतिज व्हाट्सएप" शॉर्टहैंड चरित्र वर्ग मौजूद नहीं है, और इस तरह के भयावहता की [\p{Blank}\u200b\u180e]आवश्यकता होती है। बेशक, यह समझ में आता है कि एक स्वर विभाजक को एक व्हाट्सएप चरित्र नहीं माना जाता है, लेकिन क्यों शून्य-चौड़ाई अंतरिक्ष जैसी कक्षाओं में नहीं है \sऔर \p{Blank}, मुझे मारता है।
तिमु

फॉलो-अप: मैंने पढ़ा कि दोनों को 'सीमा तटस्थ' माना जाता है, हालांकि यह स्पष्ट नहीं करता है कि क्यों
टिमो

-4

m/ /gबस में जगह दे / /और यह काम करेगा। या उपयोग \S- यह टैब, newlines, रिक्त स्थान और इतने पर जैसे सभी विशेष वर्णों को प्रतिस्थापित करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.