উত্তর:
আমি দুর্দান্ত সাফল্যের সাথে নিম্নলিখিতগুলি ব্যবহার করছি:
(["'])(?:(?=(\\?))\2.)*?\1
এটি নেস্টেড উদ্ধৃতিগুলিও সমর্থন করে।
যারা এটি কীভাবে কাজ করে তার গভীর ব্যাখ্যা চান তাদের জন্য, ব্যবহারকারী ব্যবহারকারীর প্রথম দিক থেকে একটি ব্যাখ্যা :
([""'])
একটি উদ্ধৃতি মেলে;((?=(\\?))\2.)
যদি ব্যাকস্ল্যাশ বিদ্যমান থাকে তবে এটিকে গলগল করুন, এবং তা ঘটুক বা না ঘটুক, কোনও চরিত্রের সাথে মেলে;*?
অনেক বার মিলবে (লোভহীনভাবে, সমাপ্তি উদ্ধৃতিটি না খাওয়ার জন্য);\1
উদ্বোধনের জন্য যে একই উক্তি ব্যবহার করা হয়েছিল তা মেলাও।
"foo\"
। সামনের দিকের কৌশলটি ?
কোয়ান্টিফায়ারকে অধিকারী করে তুলবে (এমনকি যদি রেইগেক্স ফ্লেভার ?+
সিনট্যাক্স বা পারমাণবিক গ্রুপিং সমর্থন করে না )
(["'])(?:\\.|[^\\])*?\1
সাধারণভাবে, নিম্নলিখিত নিয়মিত অভিব্যক্তি খণ্ডটি যা আপনি খুঁজছেন:
"(.*?)"
এটি অ লোভী * ব্যবহার করে? অপারেটর পর্যন্ত সবকিছু ক্যাপচার করতে তবে পরবর্তী ডাবল উদ্ধৃতি সহ নয়। তারপরে, আপনি ম্যাচযুক্ত পাঠ্যটি বের করার জন্য একটি ভাষা-নির্দিষ্ট পদ্ধতি ব্যবহার করেন।
পাইথনে, আপনি এটি করতে পারেন:
>>> import re
>>> string = '"Foo Bar" "Another Value"'
>>> print re.findall(r'"(.*?)"', string)
['Foo Bar', 'Another Value']
"hello \" world"
"(.*?(?<!\\))"
আমি যেতে চাই:
"([^"]*)"
[^ "] ব্যতীত কোন অক্ষরের জন্য Regex হল ' ' '
কারনেই আমি অ লোভী অনেক অপারেটর উপর এটি ব্যবহার আমি যে ঠিক নিশ্চিত আমি এটা সংশোধন পেতে করতে আপ খুঁজছেন রাখতে হবে যে।
পালানো উদ্ধৃতিগুলির সাথে মোকাবিলা করার দুটি কার্যকর উপায় দেখতে দিন। এই নিদর্শনগুলি সংক্ষিপ্ত বা নান্দনিক হতে ডিজাইন করা হয়নি, তবে দক্ষ হওয়ার জন্য।
কোনও বিকল্পের ব্যয় ছাড়াই স্ট্রিংয়ে কোটগুলি দ্রুত খুঁজে পেতে এই উপায়গুলি প্রথম অক্ষর বৈষম্য ব্যবহার করে। (ধারণাটি হ'ল বিকল্পগুলির দুটি শাখা পরীক্ষা না করেই এমন অক্ষরগুলিকে বাতিল করা হবে যা উদ্ধৃতি নয়) discard
আরও কার্যকর করার জন্য উদ্ধৃতিগুলির মধ্যে থাকা সামগ্রীকে একটি নিয়ন্ত্রিত লুপ (পুনরাবৃত্ত পরিবর্তনের পরিবর্তে) দিয়ে বর্ণনা করা হয়েছে: [^"\\]*(?:\\.[^"\\]*)*
স্পষ্টতই যে স্ট্রিংগুলির সাথে ভারসাম্যহীন উদ্ধৃতি নেই সেগুলি মোকাবেলা করার জন্য, আপনি পরিবর্তে অধিক পরিমাণে কোয়ানটিফায়ার ব্যবহার করতে পারেন: [^"\\]*+(?:\\.[^"\\]*)*+
বা অত্যধিক ব্যাকট্র্যাকিং রোধ করতে, এগুলি অনুকরণ করার জন্য একটি কার্যনির্বাহী। আপনি এমনটিও চয়ন করতে পারেন যে পরবর্তী (অরক্ষিত) উদ্ধৃতি বা স্ট্রিংয়ের সমাপ্তি অবধি উদ্ধৃত অংশটি একটি উদ্বোধনী মূল্য হতে পারে। এক্ষেত্রে প্রাপ্য কোয়ান্টিফায়ার ব্যবহার করার দরকার নেই, আপনার কেবল শেষ উদ্ধৃতিটি alচ্ছিক করা দরকার।
দ্রষ্টব্য: কখনও কখনও উদ্ধৃতিগুলি ব্যাকস্ল্যাশ দিয়ে পালানো হয় না তবে উদ্ধৃতি পুনরাবৃত্তি করে। এক্ষেত্রে বিষয়বস্তু সাবপ্যাটার্নটি দেখে মনে হচ্ছে:[^"]*(?:""[^"]*)*
নিদর্শনগুলি ক্যাপচার গ্রুপ এবং একটি ব্যাক রেফারেন্স (আমি এর মতো কিছু বোঝাতে চাইছি (["']).....\1
) এর ব্যবহার এড়িয়ে চলে এবং একটি সাধারণ বিকল্প ব্যবহার করি ["']
তবে শুরুতে ফ্যাক্টর হিসাবে।
পার্ল পছন্দ:
["'](?:(?<=")[^"\\]*(?s:\\.[^"\\]*)*"|(?<=')[^'\\]*(?s:\\.[^'\\]*)*')
(নোট যে (?s:...)
অ ক্যাপচার গ্রুপ ভিতরে dotall / singleline মোড সুইচ করার জন্য একটি অন্বিত চিনি। এই সিনট্যাক্স সমর্থিত নয়, তাহলে আপনি সহজেই সব প্যাটার্ন জন্য এই মোড সুইচ বা ডট প্রতিস্থাপন করতে পারেন [\s\S]
)
(এই প্যাটার্নটি যেভাবে লিখিত হয়েছে তা সম্পূর্ণ "হস্তচালিত" এবং চূড়ান্ত ইঞ্জিনের অভ্যন্তরীণ অপ্টিমাইজেশনের অ্যাকাউন্ট নেয় না)
ইসিএমএ স্ক্রিপ্ট:
(?=["'])(?:"[^"\\]*(?:\\[\s\S][^"\\]*)*"|'[^'\\]*(?:\\[\s\S][^'\\]*)*')
পসিক্স প্রসারিত:
"[^"\\]*(\\(.|\n)[^"\\]*)*"|'[^'\\]*(\\(.|\n)[^'\\]*)*'
বা সহজভাবে:
"([^"\\]|\\.|\\\n)*"|'([^'\\]|\\.|\\\n)*'
/pattern/
কিছু না বাছাই করে আক্ষরিক স্বরলিপিটি ব্যবহার করতে হবে (বস্তুর স্বরলিপি পরিবর্তে new RegExp("(?=[\"'])(?:\"[^\"\\\\]*...");
)
s
এখানে অপসারণ করেন তবে আপনি পার্ল সংস্করণটি ব্যবহার করতে পারেন : (?s:
এবং যদি আপনি (?s)
কোনও নকশায় রাখেন ।
গৃহীত উত্তরের RegEx তাদের স্রোভারিং উদ্ধৃতি চিহ্নগুলি সহ: "Foo Bar"
এবং "Another Value"
ম্যাচ হিসাবে মানগুলি প্রদান করে ।
এখানে RegEx রয়েছে যা উদ্ধৃতি চিহ্নগুলির মধ্যে কেবল মানগুলি ফেরত দেয় (প্রশ্নকারী যেমন জিজ্ঞাসা করছিল):
শুধুমাত্র ডাবল উদ্ধৃতি (ক্যাপচার গ্রুপ # 1 এর মান ব্যবহার করুন):
"(.*?[^\\])"
একক উদ্ধৃতি (ক্যাপচার গ্রুপ # 1 এর মান ব্যবহার করুন):
'(.*?[^\\])'
উভয়ই (ক্যাপচার গ্রুপ # 2 এর মান ব্যবহার করুন):
(["'])(.*?[^\\])\1
-
সমস্ত সমর্থন পালিয়ে গেছে এবং নেস্টেড কোটস।
src="(.*)"
তবে স্পষ্টতই এটি শেষ "এর আগে সমস্ত কিছু নির্বাচন করছিল, আপনার আরইজিএক্স, যদিও কেবলমাত্র src =" "বিষয়বস্তু নির্বাচন করেছে, তবে কীভাবে বুঝতে পারি না?
অদ্ভুতভাবে, এই উত্তরগুলির কোনওটিই এমন একটি রেজেক্স তৈরি করে না যেখানে প্রত্যাবর্তিত ম্যাচটি উদ্ধৃতিগুলির অভ্যন্তরের পাঠ্য হয়, যার জন্য এটি জিজ্ঞাসা করা হয়। এমএ-ম্যাডেন চেষ্টা করে তবে পুরো ম্যাচের চেয়ে কেবল অভ্যন্তর ম্যাচটি ক্যাপচার গ্রুপ হিসাবে পায়। এটি করার একটি উপায় হ'ল:
(?<=(["']\b))(?:(?=(\\?))\2.)*?(?=\1)
এর উদাহরণগুলি এই ডেমো https://regex101.com/r/Hbj8aP/1 এ দেখা যাবে
কী এখানে শুরু (ইতিবাচক lookbehind হয় ?<=
শেষ (এ) এবং ইতিবাচক lookahead ?=
)। উদ্ধৃতিহীন বর্তমানের চরিত্রটির পেছনে তাকিয়ে আছে একটি উদ্ধৃতিটি অনুসন্ধান করার জন্য, যদি এটি পাওয়া যায় তবে সেখান থেকে শুরু করুন এবং তারপরে লুকেইড একটি উদ্ধৃতির জন্য সামনে চরিত্রটি যাচাই করে নিচ্ছে এবং যদি সেই চরিত্রটি বন্ধ করে পাওয়া যায়। শুরুতে ["']
যে উদ্ধৃতিটি পাওয়া গেছে তার জন্য একটি গ্রুপ তৈরি করার জন্য লুকবিহীন গোষ্ঠীটি (দ্য ) বন্ধনীগুলিতে আবৃত হয়, এটি শেষের দিকে তত্ক্ষণাত ব্যবহার করা হয় এটি (?=\1)
নিশ্চিত হয়ে যায় যে এটি কেবলমাত্র সংশ্লিষ্ট কোডটি খুঁজে পেলে এটি বন্ধ হয়ে যায় make
কেবলমাত্র অন্য জটিলতাটি হ'ল যেহেতু লুয়াচহেডটি শেষের উদ্ধৃতিটি গ্রাহ্য করে না, তাই এটি আবার শুরুর দিকে ফিরে পাওয়া যাবে যা একই লাইনের সমাপ্তি এবং প্রারম্ভিক উদ্ধৃতিগুলির মধ্যে পাঠ্যটির সাথে মিলে যায়। শুরুর উদ্ধৃতিতে শব্দের গণ্ডি স্থাপন ( ["']\b
) এটির সাথে সহায়তা করে, যদিও আদর্শিকভাবে আমি চেহারাটির পূর্বের দিকে যেতে চাই তবে এটি সম্ভব বলে আমি মনে করি না। বিট মাঝখানে পালিয়ে যাওয়া চরিত্রগুলিকে অনুমতি দেয় আমি সরাসরি অ্যাডামের উত্তর থেকে নিয়েছি।
(["'])(?:(?=(\\?))\2.)*?\1
উপরের প্যাটার্নটি কাজটি করে তবে আমি এর অভিনয় সম্পর্কে উদ্বিগ্ন (এটি খারাপ নয় তবে আরও ভাল হতে পারে)। আমার নীচে এটি 20% দ্রুত।
প্যাটার্নটি "(.*?)"
কেবল অসম্পূর্ণ। এটি পড়ার জন্য প্রত্যেকের জন্য আমার পরামর্শটি কেবল এটি ব্যবহার করবেন না !!!
উদাহরণস্বরূপ এটি অনেকগুলি স্ট্রিং ক্যাপচার করতে পারে না (যদি প্রয়োজন হয় তবে আমি নীচের মতো একটি বিস্তৃত পরীক্ষা-কেস সরবরাহ করতে পারি):
স্ট্রিং = 'কেমন আছেন? আমি
\'
ভাল আছি , ধন্যবাদ ';
তাদের বাকিগুলি উপরেরটির মতোই "ভাল"।
আপনি যদি পারফরম্যান্স এবং যথার্থতা উভয়েরই যত্নশীল হন তবে নীচের সাথে শুরু করুন:
/(['"])((\\\1|.)*?)\1/gm
আমার পরীক্ষাগুলিতে এটি আমার দেখা প্রতিটি স্ট্রিংকে অন্তর্ভুক্ত করে তবে যদি আপনি এমন কোনও কিছু খুঁজে পান যা কাজ করে না তবে আমি আপনাকে খুশির সাথে আপডেট করব।
একটি অনলাইন রেজেক্স পরীক্ষকটিতে আমার প্যাটার্নটি পরীক্ষা করুন ।
উক্তিগুলি থেকে পালাতে পেরেও उद्धিত্যের মধ্যে থাকা সামগ্রীর সাথে মেলে আমার ইউজেন মিহাইলস্কুর সমাধানটি পছন্দ হয়েছিল । যাইহোক, আমি পালানোর সাথে সাথে কিছু সমস্যা আবিষ্কার করেছি এবং সেগুলি সমাধানের জন্য নীচের রেইগেক্স নিয়ে এসেছি:
(['"])(?:(?!\1|\\).|\\.)*\1
এটি কৌশলটি করে এবং এটি এখনও বেশ সহজ এবং বজায় রাখা সহজ।
ডেমো (আরও কয়েকটি টেস্ট-কেস সহ; এটি ব্যবহার করতে নির্দ্বিধায় এবং এটিতে প্রসারিত করুন)।
দ্রষ্টব্য: আপনি যদি কেবলমাত্র এমন সামগ্রী এড়িয়ে চান মধ্যে সম্পূর্ণ খেলা (কোট $0
), এবং কর্মক্ষমতা শাস্তি ব্যবহারের ভীত নয়:
(?<=(['"])\b)(?:(?!\1|\\).|\\.)*(?=\1)
দুর্ভাগ্যক্রমে, অ্যাঙ্কর হিসাবে উদ্ধৃতিগুলি ছাড়াই, আমাকে একটি বাউন্ডারি যুক্ত করতে হয়েছিল \b
যা শুরুর উদ্ধৃতি দেওয়ার পরে স্পেস এবং অ-শব্দ সীমানা অক্ষরের সাথে ভাল খেলতে পারে না।
বিকল্পভাবে, কেবল একটি গোষ্ঠী$2
যুক্ত করে স্ট্রিং ফর্মটি বের করে প্রাথমিক সংস্করণটি সংশোধন করুন :
(['"])((?:(?!\1|\\).|\\.)*)\1
পিপিএস: যদি আপনার ফোকাসটি কেবল দক্ষতার দিকে থাকে তবে ক্যাসিমির এবং হিপপলিটের সমাধানটি নিয়ে যান ; এটি একটি ভাল।
-
দ্রাঘিমাংশ স্থানাঙ্কের মতো দ্বিতীয় রেজেক্স একটি বিয়োগ চিহ্ন সহ একটি মান মিস করে ।
এই সংস্করণ
ব্যাকট্র্যাকিং নিয়ন্ত্রণ করে
/(["'])((?:(?!\1)[^\\]|(?:\\\\)*\\[^\\])*)\1/
আরও উত্তর! আমি ব্যবহৃত সমাধানটি এখানে
\"([^\"]*?icon[^\"]*?)\"
TLDR; আপনি যা বলেছিলেন তা উদ্ধৃতি এবং ভয়েলা যা খুঁজছেন তার সাথে
শব্দ আইকনটি প্রতিস্থাপন করুন !
এটি যেভাবে কাজ করে তা হ'ল কীওয়ার্ডটি সন্ধান করে এবং উদ্ধৃতিগুলির মধ্যে আর কী রয়েছে তা যত্ন করে না। ইজি:
id="fb-icon"
id="icon-close"
id="large-icon-close"
রেজেক্স একটি উদ্ধৃতি চিহ্নের জন্য সন্ধান করে "
তারপরে এটি কোনও সম্ভাব্য অক্ষরগুলির গোষ্ঠী "
সন্ধান করবে যতক্ষণ না এটি পাওয়া যায় icon
এবং অক্ষরগুলির কোনও সম্ভাব্য গোষ্ঠী যা এটি না "
হয় তারপরে একটি সমাপ্তির সন্ধান করে"
name="value"
সঙ্গে name={"value"}
এই উত্তর এর Regex আয় যেহেতু icon
/ value
(গৃহীত উত্তর অসদৃশ) দ্বিতীয় দল হিসেবে। খুঁজুন : =\"([^\"]*?[^\"]*?)\"
প্রতিস্থাপন :={"$1"}
আমি অক্সম্যানের আরও বিস্তৃত সংস্করণটি পছন্দ করেছিলাম তবে এতে কিছুটা সমস্যা ছিল (এটি উদাহরণের সাথে মেলে না
foo "string \\ string" bar
অথবা
foo "string1" bar "string2"
সঠিকভাবে, তাই আমি এটি ঠিক করার চেষ্টা করেছি:
# opening quote
(["'])
(
# repeat (non-greedy, so we don't span multiple strings)
(?:
# anything, except not the opening quote, and not
# a backslash, which are handled separately.
(?!\1)[^\\]
|
# consume any double backslash (unnecessary?)
(?:\\\\)*
|
# Allow backslash to escape characters
\\.
)*?
)
# same character as opening quote
\1
string = "\" foo bar\" \"loloo\""
print re.findall(r'"(.*?)"',string)
এই চেষ্টা করে দেখুন, কবজির মতো কাজ করে !!!
\
স্কিপ অক্ষর নির্দেশ করে
" foo bar" "loloo"
। আমি সন্দেহ আপনি মোড়ানো একটি কাঁচা স্ট্রিং মত Regex করেছিল বোঝানো: r'"\" foo bar\" \"loloo\""'
। যখনই উপযুক্ত হয় দয়া করে এসও এর দুর্দান্ত ফর্ম্যাটিং ক্ষমতাটি ব্যবহার করুন । এটি কেবল প্রসাধনী নয়; আপনি যদি সেগুলি ব্যবহার না করেন তবে আপনি কী বলতে চাইছেন তা আমরা আক্ষরিকভাবে বলতে পারি না। এবং স্ট্যাক ওভারফ্লোতে স্বাগতম !
echo 'junk "Foo Bar" not empty one "" this "but this" and this neither' | sed 's/[^\"]*\"\([^\"]*\)\"[^\"]*/>\1</g'
এর ফলস্বরূপ:> ফু বার <> <> তবে এটি <
এখানে আমি << এর স্পষ্টতার জন্য ফলাফলের স্ট্রিংটি দেখিয়েছি এবং অদ্ভুত সংস্করণ ব্যবহার করে এই সেড কমান্ডটি ব্যবহার করে আমরা প্রথমে তার আগে এবং পরে আবর্জনা ফেলে দিই এবং এরপরে "" অংশের সাথে এটি প্রতিস্থাপন করব এর <> s দ্বারা এটিকে ঘিরে।
গ্রেগ এইচ থেকে আমি আমার প্রয়োজন অনুসারে এই রেজেেক্স তৈরি করতে সক্ষম হয়েছি।
আমার একটি নির্দিষ্ট মানের সাথে মিল থাকা দরকার যা কোটগুলির ভিতরে থাকা হয়ে যোগ্য ছিল। এটি অবশ্যই একটি সম্পূর্ণ ম্যাচ হবে, কোনও আংশিক মিলের ফলে হিট শুরু হতে পারে না
যেমন "পরীক্ষা" "টেস্ট 2" এর সাথে মেলে না match
reg = r"""(['"])(%s)\1"""
if re.search(reg%(needle), haystack, re.IGNORECASE):
print "winning..."
শিকারী
আপনি যদি ডট সিনট্যাক্সের মতো কেবল একটি নির্দিষ্ট প্রত্যয়যুক্ত স্ট্রিংগুলি সন্ধান করার চেষ্টা করছেন তবে আপনি এটি চেষ্টা করতে পারেন:
\"([^\"]*?[^\"]*?)\".localized
.localized
প্রত্যয়টি কোথায় ?
উদাহরণ:
print("this is something I need to return".localized + "so is this".localized + "but this is not")
এটি ক্যাপচার করবে "this is something I need to return".localized
এবং করবে "so is this".localized
না "but this is not"
।
মাইক্রোসফ্ট ভিবিএ কোডারদের সাবসেটের জন্য পরিপূরক উত্তরটি কেবল একটি গ্রন্থাগার ব্যবহার করে Microsoft VBScript Regular Expressions 5.5
এবং এটি নিম্নলিখিত কোডটি দেয়
Sub TestRegularExpression()
Dim oRE As VBScript_RegExp_55.RegExp '* Tools->References: Microsoft VBScript Regular Expressions 5.5
Set oRE = New VBScript_RegExp_55.RegExp
oRE.Pattern = """([^""]*)"""
oRE.Global = True
Dim sTest As String
sTest = """Foo Bar"" ""Another Value"" something else"
Debug.Assert oRE.test(sTest)
Dim oMatchCol As VBScript_RegExp_55.MatchCollection
Set oMatchCol = oRE.Execute(sTest)
Debug.Assert oMatchCol.Count = 2
Dim oMatch As Match
For Each oMatch In oMatchCol
Debug.Print oMatch.SubMatches(0)
Next oMatch
End Sub
আমার জন্য এটি কাজ করেছে:
|([\'"])(.*?)\1|i
আমি এই মত একটি বাক্যে ব্যবহার করেছি:
preg_match_all('|([\'"])(.*?)\1|i', $cont, $matches);
এবং এটি দুর্দান্ত কাজ করেছে।
উপরের সমস্ত উত্তর ভাল .... যদি তারা সমস্ত ইউনিকোড অক্ষর সমর্থন করে না!ইসিএমএ স্ক্রিপ্টে (জাভাস্ক্রিপ্ট)
আপনি যদি নোড ব্যবহারকারী হন তবে আপনি স্বীকৃত উত্তরের পরিবর্তিত সংস্করণটি চাইবেন যা সমস্ত ইউনিকোড অক্ষরকে সমর্থন করে:
/(?<=((?<=[\s,.:;"']|^)["']))(?:(?=(\\?))\2.)*?(?=\1)/gmu
? The preceding token is not quantifiable