জাভা; স্ট্রিং প্রতিস্থাপন (নিয়মিত এক্সপ্রেশন ব্যবহার করে)?


129

স্কুলের প্রকল্পের অংশ হিসাবে আমাকে ফর্ম থেকে একটি স্ট্রিং প্রতিস্থাপন করতে হবে:

5 * x^3 - 6 * x^1 + 1

যেমন কিছু:

5x<sup>3</sup> - 6x<sup>1</sup> + 1

আমি বিশ্বাস করি এটি নিয়মিত প্রকাশের সাহায্যে করা যেতে পারে, তবে কীভাবে এটি করব তা আমি জানি না।

আপনি কি আমাকে এক হাত ধার দিতে পারেন?

পিএস আসল অ্যাসাইনমেন্টটি হ'ল পলিনোমিয়াল প্রসেসিং জাভা অ্যাপ্লিকেশন বাস্তবায়ন করা, এবং আমি মডেল থেকে ভিউতে পলিনমিয়াল.টোস্ট্রিং () পাস করার জন্য এটি ব্যবহার করছি এবং আমি এটি এইচটিএমএল ট্যাগ ব্যবহার করে সুন্দর উপায়ে প্রদর্শন করতে চাই।


2
মাফ করবেন, আপনি আরও নির্দিষ্ট হতে পারেন? তুমি কী বলতে চাচ্ছ আমি বুঝতে পারছি না।
ড্যান বুর্জো

5
পুরানো রসিকতা। codinghorror.com/blog/archives/001016.html এর একটি ব্যাখ্যা আছে।
মাইকেল ময়র্স

1
ওহ :) আমার মনে হয় আমি আসলে সেই নিবন্ধটি কিছুক্ষণ আগে পড়েছিলাম ... সুতরাং আপনি কি পরামর্শ দিচ্ছেন যে রেজেক্স আমার ক্ষেত্রে যাওয়ার উপায় নয়?
ড্যান বুর্জো

সুতরাং আপনি কেবল প্রসারিত আকারে বহুভুজকে অনুমতি দিচ্ছেন?
অ্যাডাম জ্যাসকিউইচ

উত্তর:


176
str.replaceAll("\\^([0-9]+)", "<sup>$1</sup>");

আহ ... তবে আপনি "5 * x" কে "5x" তে ভাঙতে মিস করেছেন
জেমস করান

দম্পতি সমস্যা: \ ^ হওয়া দরকার \\ ^ এবং $ হওয়া দরকার $ $ $
সিডিএমকেই

তবুও ত্রুটি পেয়েছে "অবৈধ অব্যাহতি ক্রম" ... আমি কি কিছু মিস করছি?
ড্যান বুর্জো

এটি আমাকে দ্বিতীয় প্যারামিটারে একটি ত্রুটি দেয়: str.replaceAll ("\\ ^ ([0-9] +)", "<sup> \ </ 1 </sup>"); আমি এটি পাই না ... :(
ড্যান বুর্জো

2
প্রাক-কম্পাইল প্যাটার্ন ব্যবহার করা কি সম্ভব? আপনি অনেক সময় একই রেজেক্সের সাথে সমস্ত প্রতিস্থাপন করুন তবে এটি কার্যকর হতে পারে।
কেইড

38
private String removeScript(String content) {
    Pattern p = Pattern.compile("<script[^>]*>(.*?)</script>",
            Pattern.DOTALL | Pattern.CASE_INSENSITIVE);
    return p.matcher(content).replaceAll("");
}

8
এটি সেরা আইএমও, কারণ এটি একটি সংকলিত রেজেক্স ব্যবহার করে তবে প্যাটার্ন অবজেক্টটি একটি স্ট্যাটিক অবজেক্ট হওয়া উচিত।
মার্সেল ভালদেজ ওরোজকো

মজার বিষয় হল replaceAllপদ্ধতিটি নিখুঁতভাবে করে Pattern.compile(regex).matcher(testString).replaceAll(regexReplacementString)! সুতরাং, আপনি যদি এভাবে প্যাটার্নটি পুনরায় ব্যবহার করেন তবে অপ্রয়োজনীয় জিনিসগুলি এড়ানো হবে। আরও, যেমন @ মার্সেলভাল্ডেজ ওরোজকো বলেছেন, এটিকে স্থির করে তোলা অপ্রয়োজনীয় প্যাটার্নগুলি সংকলন আহ্বান রোধ করবে। :)
বরুণ

20
String input = "hello I'm a java dev" +
"no job experience needed" +
"senior software engineer" +
"java job available for senior software engineer";

String fixedInput = input.replaceAll("(java|job|senior)", "<b>$1</b>");

10
import java.util.regex.PatternSyntaxException;

// (:?\d+) \* x\^(:?\d+)
// 
// Options: ^ and $ match at line breaks
// 
// Match the regular expression below and capture its match into backreference number 1 «(:?\d+)»
//    Match the character “:” literally «:?»
//       Between zero and one times, as many times as possible, giving back as needed (greedy) «?»
//    Match a single digit 0..9 «\d+»
//       Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
// Match the character “ ” literally « »
// Match the character “*” literally «\*»
// Match the characters “ x” literally « x»
// Match the character “^” literally «\^»
// Match the regular expression below and capture its match into backreference number 2 «(:?\d+)»
//    Match the character “:” literally «:?»
//       Between zero and one times, as many times as possible, giving back as needed (greedy) «?»
//    Match a single digit 0..9 «\d+»
//       Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
try {
    String resultString = subjectString.replaceAll("(?m)(:?\\d+) \\* x\\^(:?\\d+)", "$1x<sup>$2</sup>");
} catch (PatternSyntaxException ex) {
    // Syntax error in the regular expression
} catch (IllegalArgumentException ex) {
    // Syntax error in the replacement text (unescaped $ signs?)
} catch (IndexOutOfBoundsException ex) {
    // Non-existent backreference used the replacement text
}

1
@ ড্যান: নিশ্চিত হন যে আপনি বুঝে গেছেন রেজেক্স কী করছে! রেজেক্সগুলি এমন লোকদের হাতে বিপদজনক যারা তাদের প্রায় জানে। (অতএব আমি যে পোস্টটি পোস্ট করেছি))
মাইকেল মায়ার্স

@ ড্যান, যেমন এটি দাঁড়িয়েছে, রেজেক্স প্রতিটি * এর সামনে এবং তার পরে একটি স্থান আশা করে। এটি রিজেক্সে সমাধান করা যেতে পারে তবে এর একটি অংশ হিসাবে রেখে দেওয়া যাক।
লিভেন কের্মসেকার্স

@Dan। আমি মন্তব্য তৈরির পরে রেজেক্সকে কিছুটা পরিবর্তন করেছি। মূলটি ছিল: (:? \ D +) * x \ ^ (:? \ D) নতুন: (:? \ D +) * x \ ^ (:? \ D +)
লিভেন কের্মসেকার্স

10
"5 * x^3 - 6 * x^1 + 1".replaceAll("\\W*\\*\\W*","").replaceAll("\\^(\\d+)","<sup>$1</sup>");

দয়া করে মনে রাখবেন যে একক রেজেক্স / প্রতিস্থাপনে উভয় প্রতিস্থাপনে যোগদান করা একটি খারাপ পছন্দ হবে কারণ আরও সাধারণ অভিব্যক্তি যেমন x^3 - 6 * xব্যর্থ হবে।


3

এটি যদি কোনও সাধারণ গণিতের প্রকাশের জন্য হয় এবং প্যারেন্টেথিকাল এক্সপ্রেশনগুলির অনুমতি দেওয়া হয় তবে নিয়মিত প্রকাশের সাহায্যে এটি করা খুব কঠিন (সম্ভবত অসম্ভব)।

যদি কেবলমাত্র প্রতিস্থাপনগুলি আপনি দেখিয়ে থাকেন তবে এটি করা খুব কঠিন নয় hard প্রথমে স্ট্রিপ আউট *, তারপরে ক্যান বার্ক গডার এর পরিচালনা করতে দেখায় এমন ক্যাপচার ব্যবহার করুন ^


হ্যাঁ, আমি পরে একটি পিএস নোটে ব্যাখ্যা করেছি যে আমি বহুবর্ষের মৌলিক স্ট্রিং প্রতিনিধিত্বকে আরও বেশি মানব পাঠযোগ্য able ধন্যবাদ!
ড্যান বুর্জো

পলিনোমিয়ালগুলি কোনও প্যারেন্টিক্যাল এক্সপ্রেশন জড়িত এমন ফর্মে প্রসারিত করা যেতে পারে। পেরেন-ম্যাচিং দুর্দান্ত মজাদার, সুতরাং, আপনার নিজেকে কেবল প্রসারিত ফর্মের মধ্যে সীমাবদ্ধ করা উচিত নয়।
অ্যাডাম জ্যাসকিউইচ

3

আপনার বহুপদী কি? আপনি যদি এটি "প্রক্রিয়াজাতকরণ" করছেন তবে আমি একরকম উপ-এক্সপ্রেশন গাছের এক প্রকার গাছের কল্পনা করছি, এবং মনে করব যে কাঁচাটি পুনরায় পার্স করার চেয়ে আপনার স্ট্রিংটি তৈরি করতে এটি ব্যবহার করা আরও সহজ হবে think একটি রেজেক্স সহ অভিব্যক্তি।

সেখানে চিন্তা করার আলাদা উপায় there আমি নিশ্চিত নই যে আপনার অ্যাপে আর কি চলছে।


আপনি যা বলছেন তা আমি বুঝতে পেরেছি ... যা আমাকে অনেক যন্ত্রণা থেকে বাঁচাতে পারে, তবে আমি বিষয়গুলি আলাদা রাখতে চেষ্টা করছি। আমি চেয়েছিলাম পলিনোমিয়াল একটি একা ক্লাস হোক যা অন্য প্রসঙ্গে যেমন কনসোল হিসাবে ব্যবহার করা যেতে পারে ... তবে আমার পন্থাটি ভুল হতে পারে। আপনি কি মনে করেন?
ড্যান বুর্জো

আমি বুঝছি তুমি কি বলতে চাও. Polynomial.toString () এ এইচটিএমএল ট্যাগগুলি অন্তর্ভুক্ত করা অবশ্যই এমভিসি ভঙ্গ করছে। আমি এখনও মনে করি আমি এখনও এর মতো কিছু করব, কারণ এটি সত্যিই জিনিসগুলিকে সহজ করে তুলবে। সম্ভবত toHtmlString () বা কিছু ...
অ্যাডাম জ্যাসকিউইচ

অথবা হতে পারে একটি পৃথক শ্রেণি যা ভিউ বিশেষত বহুপদী বিন্যাসের জন্য ব্যবহার করে? তারপরে পলিনমিয়াল ক্লাস নিজেই ফরম্যাটিং সম্পর্কে কিছু জানার দরকার নেই।
হার্মস

আমি একটি নতুন পদ্ধতি তৈরি করেছি: টুএইচটিএমএল (); আপনি যখন এটি সম্পর্কে চিন্তা করেন, টুস্ট্রিং () এবং টুএইচটিএমএল () মূলত ধারণাটিভাবে একই জিনিস হয়, যদি না তারা বিন্যাসের জন্য বিভিন্ন বিধি নিয়োগ করে;
ড্যান বুর্জো

হ্যাঁ, ভিউ-নির্দিষ্ট বিন্যাসটি আমার পছন্দ হয় না মধ্যে বস্তু, তবে এটি আপনাকে পলিমরফিজম ব্যবহার করার জন্য একটি যুক্তি বদলে একটি স্ট্যাটিক ইউটিলিটি পদ্ধতিতে একটি দৈত্য সুইচ বিবৃতি অনেক সঙ্গে মোকাবেলা করতে সম্ভব হবে। এটি যখন একেবারে নীচে নেমে আসে, টু স্ট্রিং () এছাড়াও নির্দিষ্ট-নির্দিষ্ট ফর্ম্যাটিং ...
অ্যাডাম জ্যাসকিউইচ

1

এটা চেষ্টা কর:

String str = "5 * x^3 - 6 * x^1 + 1";
String replacedStr = str.replaceAll("\\^(\\d+)", "<sup>\$1</sup>");

Java.util.regex আমদানি করতে ভুলবেন না।


'আমদানি' টিপের জন্য ধন্যবাদ। দুর্ভাগ্যক্রমে, Eclipse আমাকে দ্বিতীয় প্যারামিটারের জন্য একটি ত্রুটি দেয়: "অবৈধ অব্যাহতি ক্রম"
ড্যান বুর্জো

হুমম ... আমি এটি গ্রোভি কনসোলে পরীক্ষা করি তবে জাভা নয়। আপনাকে এটিও নিশ্চিত করতে হবে যে এটি সমস্ত জাভা বয়লারপ্লেটে রয়েছে (যেমন একটি শ্রেণি তৈরি করুন এবং এটি একটি প্রধান পদ্ধতিতে ফেলে দিন)।
সিডিএমকেই

প্রতিস্থাপনের স্ট্রিংটি "<sup> $ 1 </sup>" হওয়া উচিত - কোনও ব্যাকস্ল্যাশ নেই। গ্রুকির ব্যাকস্ল্যাশগুলি সম্পর্কে বিভিন্ন বিধি রয়েছে; আপনার জাভাতে আপনার কোডটি পরীক্ষা করা উচিত।
অ্যালান মুর

1
class Replacement 
{
    public static void main(String args[])
    {
        String Main = "5 * x^3 - 6 * x^1 + 1";
        String replaced = Main.replaceAll("(?m)(:?\\d+) \\* x\\^(:?\\d+)", "$1x<sup>$2</sup>");
        System.out.println(replaced);
    }
}


0

এটি চেষ্টা করুন, সেরা উপায় নাও হতে পারে। কিন্তু এটি কাজ করে

String str = "5 * x^3 - 6 * x^1 + 1";
str = str.replaceAll("(?x)(\\d+)(\\s+?\\*?\\s+?)(\\w+?)(\\^+?)(\\d+?)", "$1$3<sup>$5</sup>");
System.out.println(str);

7
প্রশ্নটি ২০০৯ সালের ছিল এবং এর ইতিমধ্যে 8 টি উত্তর রয়েছে। প্রথম উত্তরের ৮২ টি ভোট রয়েছে। আপনার উত্তরটি আক্ষরিকভাবে বলেছে 'সর্বোত্তম উপায় না হতে পারে' ইঙ্গিত করে যে আরও ভাল সমাধান রয়েছে, যা ইতিমধ্যে এই থ্রেডে রয়েছে।
এরিক জি

আমি এর উপরে 'এর চেয়ে ভাল' উত্তর দেখতে পাচ্ছি না ... এর মধ্যে একটি রয়েছে যা কিছু ক্ষেত্রে নীচের চেয়ে ভাল।
সার্জিচ

0

Antlr4 এ একবার দেখুন। এটি কেবল নিয়মিত অভিব্যক্তির চেয়ে গাছের কাঠামো তৈরির পাশাপাশি আপনাকে আরও বেশি দূরত্বে পাবেন।

https://github.com/antlr/grammars-v4/tree/master/calculator (ক্যালকুলেটর.g4 এ আপনার প্রয়োজনীয় ব্যাকরণ রয়েছে)

সংক্ষেপে, আপনি একটি বাক্য বিশ্লেষণের জন্য ব্যাকরণটি সংজ্ঞায়িত করেছেন, জাভা কোড উত্পন্ন করতে অ্যান্টলার ব্যবহার করুন এবং যখন গাছটি তৈরি হচ্ছে তখন মূল্যায়ন পরিচালনা করতে কলব্যাক যুক্ত করুন।

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