সমস্ত বিশেষ চরিত্রের তালিকা যা একটি রেজেজেমে পালাতে হবে


108

আমি এমন একটি অ্যাপ্লিকেশন তৈরি করার চেষ্টা করছি যা কোনও বার্তা টেমপ্লেটের সাথে মেলে যা কোনও ব্যবহারকারী পাঠানোর চেষ্টা করছে। আমি বার্তাটি মিলে যাওয়ার জন্য জাভা রেজেেক্স ব্যবহার করছি। টেমপ্লেট / বার্তায় বিশেষ অক্ষর থাকতে পারে।

সর্বাধিক সম্ভাব্য মামলায় আমার রেজেক্সের কাজ করতে এবং মেলে যাতে বিশেষ চরিত্রগুলির পালানোর দরকার হয় তার সম্পূর্ণ তালিকা আমি কীভাবে পাব?

জাভা রেজেক্সে সমস্ত বিশেষ অক্ষর থেকে বাঁচার জন্য কি সর্বজনীন সমাধান রয়েছে?

উত্তর:


94

আপনি প্যাটার্ন শ্রেণির জাভাদোকটি দেখতে পারেন: http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html

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

সম্ভবত একটি সহজ সমাধান হিসাবে, আপনি the Q এবং \ E এর মধ্যে টেমপ্লেটটি রাখতে পারেন - এগুলির মধ্যে থাকা সমস্ত কিছুকে পালিয়ে যাওয়া হিসাবে বিবেচনা করা হয়।


43
যদি আপনি \ কিউ এবং \ ই মনে রাখতে অসুবিধা খুঁজে পান তবে আপনি পরিবর্তে প্যাটার্ন.কোয়েট ("...") ব্যবহার করতে পারেন
এমকেদেব

19
আমি আশা করি আপনি আসলে তাদের বলেছিলেন
আলেকজান্ডার ডাবিনস্কি

কেন, @ আলেকসান্দ্রডুবিনস্কি?
সোরিন

55
@ সোরিন কারণ এটি কোনও অফ-সাইটের উত্সের সাথে সংযুক্ত করার পরিবর্তে আপনার উত্তরটিতে উত্তরটি স্ট্যাক এক্সচেঞ্জের স্পিরিট (না, নীতি?)? তদ্ব্যতীত, পৃষ্ঠাটির একটি পরিষ্কার তালিকাও নেই। এখানে একটি তালিকা পাওয়া যাবে: ডকস.অরাকল.com / জ্যাভেস / টিউটোরিয়াল / essential / regex / literals.html , তবুও এটি উল্লেখ করেছে "কিছু পরিস্থিতিতে উপরে বর্ণিত বিশেষ অক্ষরগুলি মেটাচার্যাক্ট হিসাবে বিবেচিত হবে না ," কী হবে তা ব্যাখ্যা না করেই। কেউ যদি তাদের পালানোর চেষ্টা করে। সংক্ষেপে, এই প্রশ্নটি একটি ভাল উত্তর প্রাপ্য।
আলেকসান্ডার ডাবিনস্কি

8
"তাদের [ \Qএবং \E] এর মধ্যে সমস্ত কিছুই অব্যাহতিযুক্ত হিসাবে বিবেচিত হয়" - অন্যান্য \Q\E'রগুলি (যা সম্ভবত মূল রেজেক্সের মধ্যেই হতে পারে) ব্যতীত। সুতরাং, এখানেPattern.quote প্রস্তাবিত হিসাবে ব্যবহার করা ভাল এবং চক্রটি পুনরায় উদ্ভাবন না করাই ভাল ।
সাশা

92
  • নিয়মিত প্রকাশে জাভা চরিত্রগুলি এড়াতে হবে:
    \.[]{}()<>*+-=!?^$|
  • বন্ধ হওয়া বন্ধনী দুটি ( ]এবং }) একই ধরণের বন্ধনী খোলার পরে কেবল পালানো দরকার।
  • ইন []-brackets কিছু অক্ষর (যেমন +এবং -) কখনও কখনও পালাবার ছাড়া কাজ।

পালাতে না পেরে এই চরিত্রগুলিকে অনুমতি দেওয়ার কি কোনও উপায় আছে?
ডোমিনিকা

1
কোনও চরিত্রকে বাদ দেওয়া মানে চরিত্রটিকে অপারেটর হিসাবে ব্যাখ্যা করার পরিবর্তে এটির অনুমতি দেওয়া।
টোবি জি।

4
এর -মধ্যে আনস্ক্যাপ করা []সর্বদা কাজ না করে যেহেতু এটি ব্যাপ্তি নির্ধারণ করতে ব্যবহৃত হয়। এটি থেকে বাঁচা নিরাপদ। উদাহরণস্বরূপ, প্যাটার্নগুলি [-]এবং [-)]স্ট্রিংটির -সাথে মেলে তবে এর সাথে নয় [(-)]
কেনস্টন চোই

1
যদিও স্বীকৃত উত্তর প্রশ্নের উত্তর দেয়, আমি যখন কেবলমাত্র একটি দ্রুত তালিকার সন্ধান করছিলাম তখন এই উত্তরটি আমার পক্ষে আরও সহায়ক হয়েছিল।
পুরাতন নিক

-=!অগত্যা পালাতে হবে না, এটি প্রসঙ্গে নির্ভর করে। উদাহরণস্বরূপ একটি একক অক্ষর হিসাবে তারা একটি ধ্রুবক রেজেক্স হিসাবে কাজ করে।
হক

29

এড়াতে আপনি জাভা 1.5 থেকে এটি ব্যবহার করতে পারেন :

Pattern.quote("$test");

আপনি শব্দটির সাথে নির্ভুল মিল পাবেন $test


কেন এটি সবচেয়ে উচ্চ রেট দেওয়া উত্তর নয়? যে সমস্ত অক্ষরকে পালানোর দরকার রয়েছে তার তালিকাবদ্ধ করার জটিল বিশদে না গিয়ে সমস্যাটি সমাধান করে এবং এটি জেডিকে-র কোনও অতিরিক্ত কোড লেখার দরকার নেই! সরল!
ভক্সম্যান

17

মতে স্ট্রিং লিটারেল / Metacharacters ডকুমেন্টেশন পৃষ্ঠাটিতে, তারা হল:

<([{\^-=$!|]})?*+.>

সেই তালিকাটিতে কোথাও কোথাও রেফারেন্স দেওয়া ভাল হবে তবে আমি জানি না যে এটি কোথায় হতে পারে ...


11
String escaped = tnk.replaceAll("[\\<\\(\\[\\{\\\\\\^\\-\\=\\$\\!\\|\\]\\}\\)\\?\\*\\+\\.\\>]", "\\\\$0");
মার্বেল 82

1
প্যাটার্ন জাভাদোক বলেছেন যে কোনও বর্ণানুক্রমিক চরিত্রের পূর্বে ব্যাকস্ল্যাশ ব্যবহার করা ত্রুটি, যা পালানো রচনাটি বোঝায় না, তবে একটি অক্ষর অক্ষরের পূর্বে ব্যাকস্ল্যাশ ব্যবহার করা যেতে পারে that চরিত্রটি অনির্বাচিত রচনার অংশ কিনা তা নির্বিশেষে। অতএব অনেক সরল রেইজেক্সই যথেষ্ট হবে: s.replaceAll("[\\W]", "\\\\$0")যেখানে শব্দহীন \Wঅক্ষরগুলি নির্ধারণ করা হয়।
জো বোবিয়ার

6

প্রত্যেকে যা বলেছিল তার সাথে একত্রিত হয়ে, আমি রেজিএক্সপসের বিশেষ অক্ষরের তালিকাটি তাদের নিজস্ব স্ট্রিংয়ে পরিষ্কারভাবে তালিকাবদ্ধ রাখতে এবং কয়েক হাজার "\\" এর দৃষ্টিভঙ্গি বিশ্লেষণ করার চেষ্টা করা এড়াতে, আমি নিম্নলিখিতটি প্রস্তাব করছি। এটি আমার পক্ষে বেশ ভালভাবে কাজ করছে বলে মনে হচ্ছে:

final String regExSpecialChars = "<([{\\^-=$!|]})?*+.>";
final String regExSpecialCharsRE = regExSpecialChars.replaceAll( ".", "\\\\$0");
final Pattern reCharsREP = Pattern.compile( "[" + regExSpecialCharsRE + "]");

String quoteRegExSpecialChars( String s)
{
    Matcher m = reCharsREP.matcher( s);
    return m.replaceAll( "\\\\$0");
}

5

জাভা প্যাটার্ন দস্তাবেজের @ সোরিনের পরামর্শে, দেখে মনে হচ্ছে পালানোর চরগুলি অন্তত:

\.[{(*+?^$|

4
String escaped = regexString.replaceAll("([\\\\\\.\\[\\{\\(\\*\\+\\?\\^\\$\\|])", "\\\\$1");
fracz

2
)এছাড়াও আপনাকে পালাতে হবে, এবং আপনি চরিত্রের শ্রেণীর ভিতরে বা বাইরে আছেন কিনা তার উপর নির্ভর করে পালাতে আরও বেশি অক্ষর থাকতে পারে, সেক্ষেত্রে অক্ষর শ্রেণীর অভ্যন্তরে বা বাইরে Pattern.quoteউভয়ই ব্যবহারের জন্য একটি স্ট্রিং থেকে বাঁচতে বেশ ভাল কাজ করা যায়।
nhahtdh

3

Pattern.quote(String s)সাজানোর কি আপনি চান না। তবে এটি কাঙ্ক্ষিত হতে একটু বামে ছেড়ে যায়; এটি প্রকৃতপক্ষে পৃথক অক্ষরগুলি এড়ায় না, কেবল স্ট্রিংটি মোড়ক করে \Q...\E

এমন কোনও পদ্ধতি নেই যা আপনি যা সন্ধান করছেন ঠিক তা করে তবে সুসংবাদটি হ'ল জাভা নিয়মিত অভিব্যক্তির সমস্ত বিশেষ চরিত্রের হাত থেকে বাঁচা মোটামুটি সহজ:

regex.replaceAll("[\\W]", "\\\\$0")

কেন এই কাজ করে? ঠিক আছে, ডকুমেন্টেশনের জন্য Patternসুনির্দিষ্টভাবে বলা হয়েছে যে অ-বর্ণমালা অক্ষরগুলি যে অগত্যা পালাতে হবে তা থেকে বাঁচার অনুমতি রয়েছে:

কোনও বর্ণানুক্রমিক চরিত্রের আগে একটি ব্যাকস্ল্যাশ ব্যবহার করা ত্রুটি যা কোনও পালানো নির্মাণকে বোঝায় না; এগুলি নিয়মিত-এক্সপ্রেশন ভাষায় ভবিষ্যতের এক্সটেনশনের জন্য সংরক্ষিত।অক্ষরবিহীন অক্ষরের পূর্বে একটি ব্যাকস্ল্যাশ ব্যবহার করা যেতে পারে character চরিত্রটি অনির্বাচিত নির্মাণের অংশ কিনা তা নির্বিশেষে।

উদাহরণস্বরূপ, ;নিয়মিত অভিব্যক্তিতে কোনও বিশেষ চরিত্র নয়। যাইহোক, আপনি যদি এটি এড়িয়ে যান, Patternতবুও \;হিসাবে ব্যাখ্যা করা হবে; । এখানে আরও কয়েকটি উদাহরণ দেওয়া হল:

  • > হয়ে \> যা সমতূল্য>
  • [ হয়ে \[ যা পালিয়ে যাওয়া রূপ[
  • 8 এখন পর্যন্ত 8
  • \)হয়ে \\\)যা সদস্যরা যারা পালিয়ে গিয়েছিল ফরম \এবং( সংমিশ্রিত।

নোট: চাবিকাঠি "অ-বর্ণানুক্রমিক" এর সংজ্ঞা, যা ডকুমেন্টেশনে সত্যিই "অ মানে শব্দ " অক্ষর, বা অক্ষর সেট বাহিরে অক্ষর [a-zA-Z_0-9]


2

মুদ্রার অপর প্রান্তে, আপনার "অ্যাপ্লিকেশনের প্রসঙ্গে বিশেষ অক্ষর = allChars - সংখ্যা - ABC - স্পেসটি দেখতে এমন" নন-চর "রিজেक्स ব্যবহার করা উচিত।

String regepx = "[^\\s\\w]*";

2

যদিও উত্তরটি জাভার জন্য, তবে কোডটি সহজেই এই কোটলিন স্ট্রিং এক্সটেনশানটি থেকে আমি রূপায়ণ করতে পারি (যেটি @ ব্রাকলো সরবরাহ করা হয়েছে তা থেকে অভিযোজিত):

private val escapeChars = charArrayOf(
    '<',
    '(',
    '[',
    '{',
    '\\',
    '^',
    '-',
    '=',
    '$',
    '!',
    '|',
    ']',
    '}',
    ')',
    '?',
    '*',
    '+',
    '.',
    '>'
)

fun String.escapePattern(): String {
    return this.fold("") {
      acc, chr ->
        acc + if (escapeChars.contains(chr)) "\\$chr" else "$chr"
    }
}

fun main() {
    println("(.*)".escapePattern())
}

কপি করে প্রিন্ট \(\.\*\)

এখানে কর্মে এটি পরীক্ষা করুন ক্রিয়াতে দেখুন https://pl.kotl.in/h-3mXZkNE


1

ধরে নিই যে আপনার কাছে এবং বিশ্বাস (অনুমোদনের উদ্দেশ্যে) জাভা রেজেক্স ব্যবহারের অক্ষরগুলির তালিকা রয়েছে (এই প্যাটার্নগুলি কিছু প্যাটার্ন শ্রেণির সদস্যের মধ্যে প্রকাশিত হলে ভাল হবে) আপনি যদি প্রয়োজন হয় তবে চরিত্রটি থেকে বাঁচতে নিম্নলিখিত পদ্ধতিটি ব্যবহার করতে পারেন:

private static final char[] escapeChars = { '<', '(', '[', '{', '\\', '^', '-', '=', '$', '!', '|', ']', '}', ')', '?', '*', '+', '.', '>' };

private static String regexEscape(char character) {
    for (char escapeChar : escapeChars) {
        if (character == escapeChar) {
            return "\\" + character;
        }
    }
    return String.valueOf(character);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.