হোয়াইটস্পেসের সাথে মিল রাখুন তবে নিউলাইনগুলি নয়


277

আমি মাঝে মাঝে হোয়াইটস্পেসের সাথে মিল রাখতে চাই তবে নতুনরেখায় না।

এখনও অবধি আমি অবলম্বন করছি [ \t]। কম বিশ্রী উপায় আছে?


4
BTW, এই অক্ষরগুলি এছাড়াও "হোয়াইটস্পেস" আছেন: [\r\f]
ইউজিন ইয়ার্মাশ

2
@ ইউজনি এখনও কি ফর্ম ফিড করছে? (\ f's)
অরণ মুলহোল্যান্ড

1
@ আরানমুলহোল্যান্ড: যার যার চরিত্রমুখী প্রিন্টার রয়েছে। বেশিরভাগ মুদ্রকের একটি অক্ষর মোডের পাশাপাশি পোস্টস্ক্রিপ্ট বা হিউলেট প্যাকার্ড ইন্টারফেস যাকেই বলা হয়, এবং কোনও ফর্ম ফিড পাঠিয়ে কোনও পৃষ্ঠা ছুঁড়ে ফেলার জন্য।
বোরোডিন

1
@ বোরোডিন হিউলেট প্যাকার্ডসকে পিসিএল (প্রিন্টার নিয়ন্ত্রণের ভাষা) বলা হয়।
সিবি_রন

উত্তর:


182

পার্ল সংস্করণগুলি ৫.১০ এবং পরবর্তীকালে সহায়ক সংস্থা উল্লম্ব এবং অনুভূমিক অক্ষর শ্রেণিগুলি সমর্থন করে \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উপগ্রহ নয় কারণ এটি ইউ + 00A0 নো-BREAK স্পেসের \vসাথেও মেলে , এবং ইউ + 0085 নেক্সট লাইনটির সাথেও মেলে, যার কোনওটিই মিলে না\s


7
\hসমর্থন করে এমন ভাষাগুলিতেই কাজ করে PCRE
অবিনাশ রাজ

14
@ অভিনশরাজ: এই প্রশ্নটি পার্ল সম্পর্কে, যা অবশ্যই পিসিআরই সমর্থন করে
বোরোডিন

2
@ অবিনাশরাজ: ব্যাতিক্রমের জায়গার [[:blank:]]সাথে এটি মেলে না -  বা"\xA0"
বোরোডিন

6
ওয়ানা উল্লেখ করেছেন যে \hআমার ব্যবহারের ক্ষেত্রে পুরোপুরি কাজ করেছে যা নোটপ্যাড ++ এ 1 বা আরও অধিক সংলগ্ন অ-নতুন-লাইন স্পেসে সন্ধান / প্রতিস্থাপন করছে। আর কিছুই (সরল) কাজ করেনি।
স্কুইডবে

8
পার্লের যা \hকিছুটা অ-মানক করে তোলে তা হ'ল এটি অন্তর্ভুক্ত MONGOLIAN VOWEL SEPARATOR। ইউনিকোড এটিকে হোয়াইটস্পেস হিসাবে বিবেচনা করে না। সেই কারণে, পার্ল \hপসিক্স 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";
}

আউটপুট:

"" => মিল
"\ f" => মিল
"\ t" => মিল
"\ r" => কোনও মিল নেই
"\ n" => কোনও মিল নেই

উল্লম্ব ট্যাব বর্জন নোট, কিন্তু এটি v5.18 এ সম্বোধন করা হয়

খুব কঠোরভাবে আপত্তি করার আগে পার্ল ডকুমেন্টেশন একই কৌশল ব্যবহার করে। পার্লেরচার্ক্লাসের "হোয়াইটস্পেস" বিভাগের একটি পাদটীকা reads

পার্ল v5.18 এর আগে, \sউল্লম্ব ট্যাবের সাথে মেলে না। [^\S\cK](অস্পষ্টভাবে) \stradition তিহ্যগতভাবে যা করেছে তার সাথে মেলে ।

Perlrecharclass একই অধ্যায় এছাড়াও অন্যান্য পন্থা যে ডাবল নেগেটিভ ভাষা শিক্ষকদের বিরোধী পক্ষে অপমানকর হবে না দাড়ায়।

বাইরের স্থানীয় এবং ইউনিকোড বিধিগুলির বাইরে বা যখন /aস্যুইচটি কার্যকর হয়, " পার্ল v5.18, উল্লম্ব ট্যাব থেকে শুরু হয় এবং \sম্যাচ করে ” " বাতিল করুন এবং ত্যাগ করার ম্যাচিং হোয়াইটস্পেস কিন্তু সম্পর্কে newline না করার জন্য।[\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_]+/) { ... }

এইভাবে "একটি শব্দের চরিত্র তবে অঙ্ক বা আন্ডারস্কোর নয়" প্রকাশ করা কিছুটা অস্বচ্ছ। একটি পসিক্স অক্ষর-শ্রেণি অভিপ্রায়টি আরও সরাসরি যোগাযোগ করে

if (/[[:alpha:]]+/) { ... }

অথবা স্যালব্লিন্টের পরামর্শ অনুসারে একটি ইউনিকোড সম্পত্তি সহ

if (/\p{Letter}+/) { ... }

4
চতুর, কিন্তু আচরণটি অত্যন্ত আশ্চর্যজনক এবং আমি কীভাবে এটি কম বিশ্রী জানি না।
কিওয়ারটি

7
@ কিওয়ার্টি: কী আশ্চর্য? কি চেয়ে কম বিশ্রী?
ইস্ট

9
দুর্দান্ত ভয়ঙ্কর।

9
এটা খুব ভাল. অনুরোধ অনুসারে, আপনি শ্বেতস্পেসের সাথে মিল রেখেছেন (কেবল কিছু কিছু সাদা বর্ণের অক্ষর নয়) এবং আপনি লাইন ফিডের অক্ষরটিকে বাদ দেন। আপনার সমাধানটি এই প্রশ্নটির সাথে নিজেকে উদ্বেগ দেয় না: "হোয়াইটস্পেসের অক্ষরগুলি কী রয়েছে", যেমনটি হওয়া উচিত নয়। এটি ঠিক আমি যা খুঁজছিলাম is (@ ররি দ্বারা উল্লিখিত হিসাবে, একটি 'নিউলাইন'- \rএ উইন্ডোতে যেমন, অন্তর্ভুক্ত থাকতে পারে , সুতরাং ম্যাচগুলি বাদ দেওয়ার বিষয়টিও বিবেচনা করুন /[^\S\r\n]/:)
টিমো

1
এটি অবশ্যই ওপি এবং অন্য যারা কার্যত এই প্রশ্নটি অনুসন্ধান করে (ইংরেজি স্পিকারীরা, যাইহোক) এর চাহিদা পূরণ করবে। তবে এটি এখনও একটি খারাপ উত্তর। \hসহজলভ্য হলে এই সমাধানটি ব্যবহার করার কোনও অজুহাত নেই ।
অ্যালান মুর

49

গ্রেগের উত্তরের একটি পরিবর্তনের সাথে সাথে ক্যারেজ রিটার্নও অন্তর্ভুক্ত রয়েছে:

/[^\S\r\n]/

এই রেজেক্সটি /[^\S\n]/না হওয়ার চেয়ে নিরাপদ \r। আমার যুক্তিটি হ'ল উইন্ডোজ \r\nনতুন লাইনের জন্য এবং ম্যাক ওএস 9 ব্যবহার করে \r। আপনি আজকাল \rছাড়া খুঁজে পাওয়ার সম্ভাবনা নেই \n, তবে এটি যদি খুঁজে পান তবে এটি একটি নতুন লাইন ছাড়া আর কিছু বোঝাতে পারে না। সুতরাং, যেহেতু \rএকটি নতুন লাইন বোঝাতে পারে তাই আমাদের এটিও বাদ দেওয়া উচিত।


1
+1 গ্রেগের সমাধানটি আমার পাঠ্যকে দূষিত করেছিল, আপনার কাজটি ভাল কাজ করেছে।
টিমো হুভিনেন

আপনি অবাক হতে পারেন কত প্রোগ্রাম এখনও লাইন শেষের জন্য "\ r" ব্যবহার করে। আমার সমস্যাটি ফাইলটি এইগুলি ব্যবহার করে তা বোঝাতে মাঝে মাঝে আমাকে কিছুটা সময় লেগেছিল। অথবা এটি ম্যাকরোম্যান চরিত্রের এনকোডিং ব্যবহার করেছে ...
mivk

2
@ গ্রেগের মনে হচ্ছে এটির প্রথমে এটি "ভুল" হয়েছে এবং এটি আপনাকে কৃতিত্ব দেয় না। আমি এখানে কেন upvoting।
আন্দ্রে এলরিকো

14

নীচের রেজেক্সটি সাদা স্পেসগুলির সাথে মিলবে তবে কোনও নতুন লাইন চরিত্রের নয়।

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

ডেমো

আপনি যদি ক্যারেজ রিটার্নও যুক্ত করতে চান তবে operatorণাত্মক চেহারাগুলির ভিতরে অপারেটরের \rসাথে যুক্ত করুন |

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

ডেমো

যোগ +অ ক্যাপচারিং গ্রুপ পর এক বা একাধিক সাদা স্পেস মেলে।

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

ডেমো

আমি জানি না কেন আপনি লোকেরা [[:blank:]]কোনও অনুভূমিক সাদা স্থান ( স্পেস এবং ট্যাব) এর সাথে মেলে এমন পসিক্স অক্ষর শ্রেণির উল্লেখ করতে ব্যর্থ হয়েছেন ) এর সাথে । এই পসিক্স ক্র্যাক্টর ক্লাসটি বিআরই ( বেসিক রেগুলার এক্সপ্রেশনস ), ইআরই ( এক্সটেন্ডেড নিয়মিত এক্সপ্রেশন ), পিসিআরই ( পার্ল সামঞ্জস্যপূর্ণ নিয়মিত এক্সপ্রেশন ) এ কাজ করবে।

ডেমো


এটিই সেরা সমাধান!
loretoparisi

13

আপনি যা খুঁজছেন তা হ'ল পসিক্স blankঅক্ষর শ্রেণি। পার্লে এটি উল্লেখ করা হয়েছে:

[[:blank:]]

জাভাতে (সক্ষম করতে ভুলবেন না UNICODE_CHARACTER_CLASS):

\p{Blank}

অনুরূপ তুলনায় \h, POSIX blankআরও কয়েকটি রেজেক্স ইঞ্জিন ( রেফারেন্স ) দ্বারা সমর্থিত । একটি বড় সুবিধা হ'ল এর সংজ্ঞাটি এন সি-তে স্থির করা হয়েছে : ইউনিকোড নিয়মিত এক্সপ্রেশনগুলির সামঞ্জস্য বৈশিষ্ট্য এবং ইউনিকোড সমর্থনকারী সমস্ত রেগেক্স স্বাদ জুড়ে স্ট্যান্ডার্ড। (উদাহরণস্বরূপ, পার্লে \hঅতিরিক্তটি অন্তর্ভুক্ত করার জন্য পছন্দ করে MONGOLIAN VOWEL SEPARATOR)) তবে, পক্ষে যুক্তি\h হ'ল এটি সর্বদা ইউনিকোড অক্ষরগুলি সনাক্ত করে (যদিও ইঞ্জিনগুলি তাতে একমত না হলেও), যখন পসিক্স অক্ষর শ্রেণিগুলি প্রায়শই ডিফল্ট ASCII থাকে কেবলমাত্র (জাভা হিসাবে)

তবে সমস্যাটি হ'ল এমনকি ইউনিকোডের সাথে লেগে থাকা 100% সমস্যাটি সমাধান করে না। নিম্নলিখিত অক্ষরগুলি বিবেচনা করুন যা ইউনিকোডে হোয়াইটস্পেস হিসাবে বিবেচিত হয় না:

  • U + 180E মঙ্গোলিয়ান স্বর বিভাজন

  • ইউ + 200 বি জিরো প্রস্থের স্পেস

  • ইউ + 200 সি জিরো প্রস্থ নন-যোগার

  • ইউ + 200 ডি জিরো প্রস্থ জোয়ার

  • U + 2060 ওয়ার্ড জোয়ার

  • U + FEFF শূন্য প্রস্থ অ-ভাবার স্থান নয়

    Https://en.wikedia.org/wiki/White-space_character থেকে নেওয়া

পূর্বোক্ত মঙ্গোলিয়ান স্বর বিভাজক সম্ভবত কোনও ভাল কারণের জন্য অন্তর্ভুক্ত নেই। এটি 200 সি এবং 200 ডি সহ, শব্দের (এএফআইকে) মধ্যে ঘটে এবং এর ফলে অন্যান্য সমস্ত সাদা স্থান মেনে চলা মূল নিয়মটি ভেঙে দেয়: আপনি এটির সাথে টোকনাইজ করতে পারেন। এরা আরও মোডিফায়ারের মতো। যাইহোক, ZERO WIDTH SPACE, WORD JOINER, এবংZERO WIDTH NON-BREAKING SPACE (যদি এটি একটি বাইট-অর্ডার চিহ্ন ছাড়া অন্য হিসাবে ব্যবহৃত হয়) আমার বই হোয়াইটস্পেস নিয়ম মাপসই করা হবে। অতএব, আমি তাদের আমার অনুভূমিক সাদা স্থানের অক্ষর শ্রেণিতে অন্তর্ভুক্ত করি।

জাভাতে:

static public final String HORIZONTAL_WHITESPACE = "[\\p{Blank}\\u200B\\u2060\\uFFEF]"

আপনার জাভা সংকলনের জন্য যথাযথ রেজিএক্সএক্স সংকলন পতাকাগুলি যুক্ত করতে হবে এবং জাভা 7 বা তারপরে চালানো হবে। কোনও ইভেন্টে, প্রশ্নটি জাভা বা পিসিআরই সম্পর্কে মোটেই ছিল না, সুতরাং এটি সবই অবিচল।
tchrist

@ ক্রিশ্চট এটিকে নির্দেশ করার জন্য আপনাকে ধন্যবাদ। আমি আমার উত্তর আপডেট করব। যদিও আমি উত্তর দিচ্ছি না যে আমার উত্তর অপ্রাসঙ্গিক। অনবদ্য কি তা perlমূল প্রশ্নের ট্যাগ question
আলেকসান্দ্র ডাবিনস্কি

1
@ আলেকসান্ডারডুবিনস্কি, জাভাস্ক্রিপ্টে \ পি {ফাঁকা in সমর্থিত নয়, তাই অবশ্যই "সমস্ত রেজিটসের স্বাদে মানক" -1
ভ্যালেন্টিন ভ্যাসিলিভ

সর্বাধিক তথ্যবহুল। আমি জানি যে এটি একটি সাধারণ এবং সম্পূর্ণ "অনুভূমিক শ্বেতস্থান" শর্টহ্যান্ড চরিত্রের শ্রেণীর অস্তিত্ব নেই এবং এটির মতো ভয়াবহতা [\p{Blank}\u200b\u180e]প্রয়োজন তা জেনে আমি বিরক্তিকর বলে মনে করি । স্বীকার করা যায় যে, স্বর বিভাজককে একটি সাদা বর্ণের চরিত্র হিসাবে বিবেচনা করা হয় না , তবে শূন্য-প্রস্থের স্থানটি কেন ক্লাসে নেই \sএবং \p{Blank}আমাকে মারধর করে।
টিমো

ফলো-আপ: আমি পড়তে উভয় বলে মনে করা হয় 'সীমানা নিরপেক্ষ' যদিও যে ব্যাখ্যা না কেন
টিমো

-4

m/ /gশুধু জায়গা দিন / /, এবং এটি কাজ করবে। বা ব্যবহার করুন \S- এটি ট্যাব, নিউলাইনস, স্পেসস ইত্যাদির মতো সমস্ত বিশেষ অক্ষরকে প্রতিস্থাপন করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.