রেজেক্সে একটি শব্দের সীমা কী?


137

আমি জাভা ১.6 এ জাভা রেজিক্সগুলি ব্যবহার করছি (সংখ্যার আউটপুট পার্স করতে, অন্যান্য উদ্দেশ্যে) এবং \b("শব্দের সীমানা") এর সঠিক সংজ্ঞা পাই না । আমি ধরে নিয়েছিলাম যে -12এটি একটি "পূর্ণসংখ্যার শব্দ" হবে (এর সাথে মিলছে \b\-?\d+\b) তবে মনে হয় এটি কার্যকর হয় না। স্পেস-বিভাজিত সংখ্যার সাথে মিলে যাওয়ার উপায়গুলি জানতে পেরে আমি কৃতজ্ঞ হব।

উদাহরণ:

Pattern pattern = Pattern.compile("\\s*\\b\\-?\\d+\\s*");
String plus = " 12 ";
System.out.println(""+pattern.matcher(plus).matches());
String minus = " -12 ";
System.out.println(""+pattern.matcher(minus).matches());
pattern = Pattern.compile("\\s*\\-?\\d+\\s*");
System.out.println(""+pattern.matcher(minus).matches());

এটি ফিরে আসে:

true
false
true

আপনি কি ইনপুট এবং প্রত্যাশিত আউটপুট সহ একটি ছোট উদাহরণ পোস্ট করতে পারেন?
ব্রেন্ট লিখেছেন কোড

উদাহরণ প্যাটার্ন প্যাটার্ন = প্যাটার্ন.কম.পাইল ("\\ s * \\ b \\ -? \\ d + \\ s *"); স্ট্রিং প্লাস = "12"; System.out.println ( "" + + pattern.matcher (প্লাস) .matches ()); স্ট্রিং বিয়োগ = "-12"; System.out.println ( "" + + pattern.matcher (বিয়োগ) .matches ()); প্যাটার্ন = প্যাটার্ন.কম.পাইল ("\\ s * \\ -? \\ d + \\ s *"); System.out.println ( "" + + pattern.matcher (বিয়োগ) .matches ()); দেয়: সত্য মিথ্যা সত্য
peter.murray.rust

উত্তর:


97

একটি শব্দের সীমানা, বেশিরভাগ রেজেক্স উপভাষায়, \wএবং \W(অ-শব্দ চর) এর মধ্যে বা স্ট্রিংয়ের শুরুতে বা শেষে যদি একটি শব্দ বর্ণ ( [0-9A-Za-z_]) দিয়ে শুরু হয় বা শেষ হয় (যথাক্রমে) হয় is

সুতরাং, স্ট্রিংয়ে "-12", এটি 1 বা 2 এর আগে মিলবে The ড্যাশ কোনও শব্দের চরিত্র নয়।


35
Correctamundo। \bশূন্য-প্রস্থের প্রতিলিপিটি যা \wএকদিকে থাকলে মেলে এবং \Wঅন্যদিকে থাকে বা অবস্থানটি স্ট্রিংয়ের শুরু বা শেষ হয়। \wইংরেজির জন্য বিশেষভাবে কার্যকর কিছু হিসাবে নয়, নির্বিচারে "সনাক্তকারী" অক্ষর (অ্যালাম এবং আন্ডারস্কোর) হিসাবে সংজ্ঞায়িত করা হয়।
hobbs

100% সঠিক। আপনার সম্পর্কে শুধু মন্তব্য না করার জন্য দুঃখিত। আপনার উত্তরটি দেখার আগে আমি জমা দিয়েছি।
ব্রেন্ট লিখেছেন কোড

5
বোঝার স্বার্থে, এটা সম্ভব Regex পুনর্লিখন হয় \bhello\bব্যবহার না করেই \b(ব্যবহার \w, \Wএবং অন্যান্য)?
ডেভিড পোর্টাবেলা

5
এই অনুসারে বাছাই করুন: (^|\W)hello($|\W)এটি এর আগে এবং পরে কোনও শব্দের অক্ষর ক্যাপচার করবে না, সুতরাং এটি আরও বেশি পছন্দ (^|(?<=\W))hello($|(?=\W))(লকहेহেড / লুকবিহীন বক্তব্যগুলি ব্যবহার করে) হবে।
ব্রায়ানারি

6
@ ব্রায়ানারি কিছুটা সহজ : (?<!\w)hello(?!\w).
ডেভিড নিপ

28

একটি শব্দ সীমানা তিনটি অবস্থানের মধ্যে একটিতে ঘটতে পারে:

  1. স্ট্রিংয়ের প্রথম অক্ষরের আগে, প্রথম অক্ষরটি যদি একটি শব্দের অক্ষর হয়।
  2. স্ট্রিংয়ের শেষ অক্ষরের পরে যদি শেষ অক্ষরটি একটি শব্দের চরিত্র হয়।
  3. স্ট্রিংয়ের দুটি অক্ষরের মধ্যে যেখানে একটি শব্দের চরিত্র এবং অন্যটি শব্দের চরিত্র নয়।

শব্দের অক্ষরগুলি আলফা-সংখ্যাসূচক; একটি বিয়োগ চিহ্ন নয়। রেজেক্স টিউটোরিয়াল থেকে নেওয়া ।


21

নিয়মিত অভিব্যক্তি শেখার কোর্সে, আমি সত্যই যা মেটাচরেক্টারে আটকে ছিলাম \b। আমি নিজেকে পুনরাবৃত্তি করে " এটি কী, এটি কী " জিজ্ঞাসা করার সময় আমি এর অর্থ বুঝতে পারি নি । ওয়েবসাইটটি ব্যবহার করে কিছু চেষ্টা করার পরে , আমি শব্দের প্রতিটি শুরুতে এবং শব্দের শেষে গোলাপী উল্লম্ব ড্যাশগুলি লক্ষ্য করি। আমি এটির অর্থটি তখন ভালভাবে পেয়েছি। এটা এখন ঠিক আছে শব্দ ( \w) -boundary

আমার দৃষ্টিভঙ্গি কেবলমাত্র প্রচুর বোঝাপড়া-ভিত্তিক। এর পিছনে যুক্তি অন্য উত্তর থেকে পরীক্ষা করা উচিত।

এখানে চিত্র বর্ণনা লিখুন


3
একটি শব্দের
গণ্ডি

2
এই পোস্টটি বলার পরিবর্তে প্রদর্শনের জন্য creditণের দাবিদার। একটি ছবির মূল্য হাজার শব্দের।
এম_এম

13

একটি শব্দের সীমানা এমন একটি অবস্থান যা শব্দের চরিত্রের আগে হয় এবং তার পরে হয় না, বা শব্দের চরিত্র অনুসরণ করে থাকে এবং তার আগে হয় না।


8

\bস্টাইল রেজেক্সের সীমানা আসলে এখানে কী তা নিয়ে আমি কথা বলি ।

ছোট গল্পটি হ'ল তারা শর্তযুক্ত । তাদের পাশের আচরণের উপর নির্ভর করে।

# same as using a \b before:
(?(?=\w) (?<!\w)  | (?<!\W) )

# same as using a \b after:
(?(?<=\w) (?!\w)  | (?!\W)  )

কখনও কখনও এটি আপনি চান না। সম্প্রসারণের জন্য আমার অন্যান্য উত্তর দেখুন।


7

আমি অ্যালান মুরের উত্তরটি ব্যাখ্যা করতে চাই

শব্দের সীমানা এমন একটি অবস্থান যা শব্দের চরিত্রের আগে হয় এবং তার পরে হয় না বা শব্দের চরিত্র অনুসরণ করে থাকে এবং তার আগে হয় না।

ধরুন আমি একটি স্ট্রিং আছে "এই একটিএকটি T, এবং সে এর একটি wesome", এবং আমি সব সংঘটন (গুলি) চিঠি 'একটি' এই চিঠি এ বিদ্যমান শুধুমাত্র যদি প্রতিস্থাপন করতে অনুমিত করছি "একটি শব্দের সীমানা" , অর্থাত্ a'বিড়াল' এর ভিতরে থাকা অক্ষরটি প্রতিস্থাপন করা উচিত নয়।

সুতরাং আমি হিসাবে হিসাবে রেজেক্স ( পাইথন মধ্যে ) সঞ্চালন করব

re.sub("\ba","e", myString.strip())প্রতিস্থাপন // aসঙ্গেe

তাই আউটপুট হবে এই eএকটি টন eয় সে এর ewesome


5

আমি টেক্সট অনুসন্ধানের শব্দ পছন্দ জন্য একটি এমনকি খারাপ সমস্যাতে পড়েছি .NET, C++, C#, এবং C। আপনি ভাববেন যে কম্পিউটার প্রোগ্রামাররা এমন কোনও ভাষার নাম দেওয়ার চেয়ে আরও ভাল জানবেন যার পক্ষে নিয়মিত প্রকাশ করা শক্ত।

যাই হোক, এটা আমি কি জানতে পেরেছি (থেকে বেশিরভাগই সংক্ষিপ্ত করা হয় http://www.regular-expressions.info , যা একটি ভালো সাইট): Regex অধিকাংশ স্বাদে, অক্ষর আছে যা সংক্ষিপ্ত সরাসরি চরিত্র বর্গ দ্বারা মেলানো হয় \wহয় অক্ষর যা শব্দ সীমানা দ্বারা শব্দ অক্ষর হিসাবে বিবেচিত হয় characters জাভা ব্যতিক্রম। জাভা ইউনিকোডের জন্য সমর্থন করে \bতবে এর জন্য নয় \w। (আমি নিশ্চিত যে সেসময় এটির জন্য একটি ভাল কারণ ছিল)।

এর \wঅর্থ দাঁড়ায় "শব্দ চরিত্র"। এটি সবসময় ASCII অক্ষরের সাথে মেলে [A-Za-z0-9_]। আন্ডারস্কোর এবং অঙ্কগুলির অন্তর্ভুক্তিটি লক্ষ্য করুন (তবে ড্যাশ নয়!)। ইউনিকোডকে সমর্থন করে এমন বেশিরভাগ স্বাদে \wঅন্যান্য স্ক্রিপ্টগুলির অনেকগুলি অক্ষর অন্তর্ভুক্ত রয়েছে। কোন চরিত্রগুলি আসলে অন্তর্ভুক্ত করা হয়েছে তা নিয়ে প্রচুর অসঙ্গতি রয়েছে। বর্ণমালা স্ক্রিপ্ট এবং আদর্শগ্রন্থগুলি থেকে বর্ণ এবং অঙ্কগুলি সাধারণত অন্তর্ভুক্ত করা হয়। অঙ্কগুলি আন্ডারস্কোর এবং সংখ্যা চিহ্ন ছাড়া অন্য সংযোগ বিরামচিহ্নগুলি অন্তর্ভুক্ত থাকতে পারে বা নাও থাকতে পারে। এক্সএমএল স্কিমা এবং এক্সপাথ এমনকি সমস্ত চিহ্নগুলিকে অন্তর্ভুক্ত করে \w। তবে জাভা, জাভাস্ক্রিপ্ট এবং পিসিআরই কেবলমাত্র ASCII অক্ষরের সাথে মেলে \w

যে কারণে জাভা-ভিত্তিক রেজেক্স অনুসন্ধান করে C++, C#বা .NET(আপনি যখন পিরিয়ড এবং প্লাসগুলি এড়িয়ে যাওয়ার কথা মনে রাখবেন তখনও) দ্বারা স্ক্রু করা হয় \b

দ্রষ্টব্য: আমি টেক্সটে ভুল সম্পর্কে কী করব তা নিশ্চিত নই, যেমন যখন কোনও বাক্য শেষে কোনও সময়কালের পরে কোনও স্থান রাখে না। আমি এটির জন্য অনুমতি দিয়েছি, তবে আমি নিশ্চিত নই যে এটি করণটি অবশ্যই প্রয়োজন।

যাইহোক, জাভাতে, আপনি যদি এই অদ্ভুত নামযুক্ত ভাষার জন্য পাঠ্য সন্ধান করেন তবে আপনাকে \bসাদা স্থান এবং বিরামচিহ্ন ডিজাইনারদের আগে এবং পরে এর সাথে প্রতিস্থাপন করতে হবে । উদাহরণ স্বরূপ:

public static String grep(String regexp, String multiLineStringToSearch) {
    String result = "";
    String[] lines = multiLineStringToSearch.split("\\n");
    Pattern pattern = Pattern.compile(regexp);
    for (String line : lines) {
        Matcher matcher = pattern.matcher(line);
        if (matcher.find()) {
            result = result + "\n" + line;
        }
    }
    return result.trim();
}

তারপরে আপনার পরীক্ষা বা প্রধান ফাংশনে:

    String beforeWord = "(\\s|\\.|\\,|\\!|\\?|\\(|\\)|\\'|\\\"|^)";   
    String afterWord =  "(\\s|\\.|\\,|\\!|\\?|\\(|\\)|\\'|\\\"|$)";
    text = "Programming in C, (C++) C#, Java, and .NET.";
    System.out.println("text="+text);
    // Here is where Java word boundaries do not work correctly on "cutesy" computer language names.  
    System.out.println("Bad word boundary can't find because of Java: grep with word boundary for .NET="+ grep("\\b\\.NET\\b", text));
    System.out.println("Should find: grep exactly for .NET="+ grep(beforeWord+"\\.NET"+afterWord, text));
    System.out.println("Bad word boundary can't find because of Java: grep with word boundary for C#="+ grep("\\bC#\\b", text));
    System.out.println("Should find: grep exactly for C#="+ grep("C#"+afterWord, text));
    System.out.println("Bad word boundary can't find because of Java:grep with word boundary for C++="+ grep("\\bC\\+\\+\\b", text));
    System.out.println("Should find: grep exactly for C++="+ grep(beforeWord+"C\\+\\+"+afterWord, text));

    System.out.println("Should find: grep with word boundary for Java="+ grep("\\bJava\\b", text));
    System.out.println("Should find: grep for case-insensitive java="+ grep("?i)\\bjava\\b", text));
    System.out.println("Should find: grep with word boundary for C="+ grep("\\bC\\b", text));  // Works Ok for this example, but see below
    // Because of the stupid too-short cutsey name, searches find stuff it shouldn't.
    text = "Worked on C&O (Chesapeake and Ohio) Canal when I was younger; more recently developed in Lisp.";
    System.out.println("text="+text);
    System.out.println("Bad word boundary because of C name: grep with word boundary for C="+ grep("\\bC\\b", text));
    System.out.println("Should be blank: grep exactly for C="+ grep(beforeWord+"C"+afterWord, text));
    // Make sure the first and last cases work OK.

    text = "C is a language that should have been named differently.";
    System.out.println("text="+text);
    System.out.println("grep exactly for C="+ grep(beforeWord+"C"+afterWord, text));

    text = "One language that should have been named differently is C";
    System.out.println("text="+text);
    System.out.println("grep exactly for C="+ grep(beforeWord+"C"+afterWord, text));

    //Make sure we don't get false positives
    text = "The letter 'c' can be hard as in Cat, or soft as in Cindy. Computer languages should not require disambiguation (e.g. Ruby, Python vs. Fortran, Hadoop)";
    System.out.println("text="+text);
    System.out.println("Should be blank: grep exactly for C="+ grep(beforeWord+"C"+afterWord, text));

পিএস আমার ধন্যবাদ http://regexpal.com/ যাকে ছাড়া রেজেক্স ওয়ার্ল্ডটি খুব কৃপণ হবে!


আমি কেন মেলাতে পারিনি তা বোঝার চেষ্টা C#
করেও

4

সীমানা শর্তাবলী ডকুমেন্টেশন দেখুন:

http://java.sun.com/docs/books/tutorial/essential/regex/bounds.html

এই নমুনাটি দেখুন:

public static void main(final String[] args)
    {
        String x = "I found the value -12 in my string.";
        System.err.println(Arrays.toString(x.split("\\b-?\\d+\\b")));
    }

আপনি যখন এটি মুদ্রণ করবেন তখন লক্ষ্য করুন আউটপুটটি এটি:

[আমি আমার স্ট্রিংয়ের মধ্যে মানটি পেয়েছি]]

এর অর্থ হ'ল "-" চরিত্রটি কোনও শব্দের সীমানায় রয়েছে বলে ধরে নেওয়া হচ্ছে না কারণ এটি কোনও শব্দের চরিত্র হিসাবে বিবেচিত নয়। দেখে মনে হচ্ছে @ ব্রায়ানারি কিন্ডা আমাকে ঘুষি মারল, তাই সে একটি ভোট পেয়েছে।


2

শব্দের সীমানা-বি ব্যবহৃত হয় যেখানে একটি শব্দ শব্দের অক্ষর এবং অন্য একটিতে শব্দহীন অক্ষর হওয়া উচিত। Negativeণাত্মক সংখ্যার জন্য নিয়মিত এক্সপ্রেশন হওয়া উচিত

--?\b\d+\b

কাজ ডেমো চেক করুন


1

আমি বিশ্বাস করি যে আপনার সমস্যাটি -শব্দের চরিত্র নয় এমন কারণে হয়েছে । সুতরাং, সীমানা শব্দটি এর পরে মিলবে -এবং তাই এটি ধারণ করবে না। শব্দের সীমানা প্রথম এবং শেষের অক্ষরের পরে একটি স্ট্রিংয়ের সাথে মিলিত হয়, পাশাপাশি কোনও স্থান যেখানে এটি শব্দের অক্ষর বা অ-শব্দের অক্ষর এবং এর পরে বিপরীত হয়। আরও মনে রাখবেন যে শব্দের সীমানা শূন্য-প্রস্থের ম্যাচ।

একটি সম্ভাব্য বিকল্প হ'ল

(?:(?:^|\s)-?)\d+\b

এটি কোনও স্থানের অক্ষর এবং alচ্ছিক ড্যাশ দিয়ে শুরু হওয়া এবং শব্দের সীমানায় শেষ হওয়া কোনও সংখ্যার সাথে মিলবে। এটি স্ট্রিংয়ের শুরুতে একটি সংখ্যার সাথে মিলবে।


0

আমি মনে করি এটি শেষ ম্যাচের বা স্ট্রিংয়ের শুরু বা শেষের সীমানা (অর্থাত্ চরিত্র অনুসরণ)


1
আপনি ভাবছেন \G: \Aপ্রথম ম্যাচের প্রচেষ্টায় স্ট্রিংয়ের (যেমন ) শুরুর সাথে মেলে; এর পরে এটি আগের ম্যাচটি শেষ হওয়ার পজিশনে মেলে।
অ্যালান মুর

0

আপনি যখন \\b(\\w+)+\\bশব্দের সাথে একমাত্র শব্দের অক্ষর যুক্ত শব্দের সাথে হুবহু মিল ব্যবহার করেন([a-zA-Z0-9])

আপনার ক্ষেত্রে উদাহরণস্বরূপ \\bরেজেক্সের সূচনাতে সেট করা গ্রহণ করবে -12(স্থান সহ) তবে আবার এটি গ্রহণ করবে না -12(স্থান ছাড়াই)

আমার শব্দগুলিকে সমর্থন করার জন্য রেফারেন্সের জন্য: https://docs.oracle.com/javase/tutorial/essential/regex/bounds.html

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