রেজিএক্স: উদ্ধৃতি চিহ্নের মধ্যে গ্র্যাবিংয়ের মান


উত্তর:


361

আমি দুর্দান্ত সাফল্যের সাথে নিম্নলিখিতগুলি ব্যবহার করছি:

(["'])(?:(?=(\\?))\2.)*?\1

এটি নেস্টেড উদ্ধৃতিগুলিও সমর্থন করে।

যারা এটি কীভাবে কাজ করে তার গভীর ব্যাখ্যা চান তাদের জন্য, ব্যবহারকারী ব্যবহারকারীর প্রথম দিক থেকে একটি ব্যাখ্যা :

([""'])একটি উদ্ধৃতি মেলে; ((?=(\\?))\2.)যদি ব্যাকস্ল্যাশ বিদ্যমান থাকে তবে এটিকে গলগল করুন, এবং তা ঘটুক বা না ঘটুক, কোনও চরিত্রের সাথে মেলে; *?অনেক বার মিলবে (লোভহীনভাবে, সমাপ্তি উদ্ধৃতিটি না খাওয়ার জন্য); \1উদ্বোধনের জন্য যে একই উক্তি ব্যবহার করা হয়েছিল তা মেলাও।


6
@ স্টিভ: এটিও ভুলভাবে মিলবে "foo\"। সামনের দিকের কৌশলটি ?কোয়ান্টিফায়ারকে অধিকারী করে তুলবে (এমনকি যদি রেইগেক্স ফ্লেভার ?+সিনট্যাক্স বা পারমাণবিক গ্রুপিং সমর্থন করে না )
রবিন

1
অজগর দিয়ে এটি একটি ত্রুটি উত্থাপন করে: sre_constants.error: ওপেন গ্রুপকে উল্লেখ করতে পারে না
a1an

9
এটি ম্যাচের উদ্ধৃতি সহ মানগুলি প্রদান করে। অনুরোধ অনুসারে কেবল উদ্ধৃতিগুলির মধ্যে থাকা সামগ্রীটি ফেরত দেওয়ার কোনও সুযোগ নেই ?
মার্টিন স্নাইডার

4
একজন দখলদারকে কোয়ান্টিফায়ার হিসাবে গৌণ ব্যবহার করা সম্পূর্ণ অপ্রয়োজনীয় এবং বিভ্রান্তিকর। কেবলমাত্র একটি বিকল্প ব্যবহার করুন:(["'])(?:\\.|[^\\])*?\1
অরণ-ফাই

2
কিভাবে খালি স্ট্রিং এড়ানো?
বিকাশ বানসাল

332

সাধারণভাবে, নিম্নলিখিত নিয়মিত অভিব্যক্তি খণ্ডটি যা আপনি খুঁজছেন:

"(.*?)"

এটি অ লোভী * ব্যবহার করে? অপারেটর পর্যন্ত সবকিছু ক্যাপচার করতে তবে পরবর্তী ডাবল উদ্ধৃতি সহ নয়। তারপরে, আপনি ম্যাচযুক্ত পাঠ্যটি বের করার জন্য একটি ভাষা-নির্দিষ্ট পদ্ধতি ব্যবহার করেন।

পাইথনে, আপনি এটি করতে পারেন:

>>> import re
>>> string = '"Foo Bar" "Another Value"'
>>> print re.findall(r'"(.*?)"', string)
['Foo Bar', 'Another Value']

11
এটি দুর্দান্ত, তবে এটি পালানো উদ্ধৃতি সহ স্ট্রিংগুলি পরিচালনা করে না। উদাহরণস্বরূপ,"hello \" world"
রোবট

জাভাস্ক্রিপ্টের ম্যাচটি ব্যবহার করে, এটি উদ্ধৃতি চিহ্নগুলির সাথেও মিলবে। : এটা Exec উপর যেমন এখানে বর্ণিত iterating সঙ্গে কাজ করবে stackoverflow.com/questions/7998180/...
Kiechlus

4
@ অরববিট আমি জানি জবাবের জন্য কিছুটা দেরি হয়েছে কিন্তু, নেতিবাচক লুকের পিছনে কী? "(.*?(?<!\\))"
ম্যাটিউস

4
আপনাকে ধন্যবাদ - এটি সহজ তবে যদি আপনি নিশ্চিত হন যে মোকাবেলা করার জন্য কোনও পালানো উদ্ধৃতি নেই।
স্কয়ারকাণ্ডি

একটি শব্দ. অসাধারণ !
শিব অবুলা

89

আমি যেতে চাই:

"([^"]*)"

[^ "] ব্যতীত কোন অক্ষরের জন্য Regex হল ' ' '
কারনেই আমি অ লোভী অনেক অপারেটর উপর এটি ব্যবহার আমি যে ঠিক নিশ্চিত আমি এটা সংশোধন পেতে করতে আপ খুঁজছেন রাখতে হবে যে।


1
এটি বিভিন্ন রেজেক্স ব্যাখ্যার মধ্যেও ভাল আচরণ করে।
ফিল বনেট

5
এটি আমার বিচক্ষণতা বাঁচিয়েছে। .NET, এর Regex বাস্তবায়ন "(।? *)" (এটা অ লোভী কাজ করে না) পছন্দসই প্রভাব আছে না, কিন্তু "([^"] *) "আছে।
জেনস Neubauer

এটি সেরা উত্তর ইমো। ধন্যবাদ
লামাও 123

28

পালানো উদ্ধৃতিগুলির সাথে মোকাবিলা করার দুটি কার্যকর উপায় দেখতে দিন। এই নিদর্শনগুলি সংক্ষিপ্ত বা নান্দনিক হতে ডিজাইন করা হয়নি, তবে দক্ষ হওয়ার জন্য।

কোনও বিকল্পের ব্যয় ছাড়াই স্ট্রিংয়ে কোটগুলি দ্রুত খুঁজে পেতে এই উপায়গুলি প্রথম অক্ষর বৈষম্য ব্যবহার করে। (ধারণাটি হ'ল বিকল্পগুলির দুটি শাখা পরীক্ষা না করেই এমন অক্ষরগুলিকে বাতিল করা হবে যা উদ্ধৃতি নয়) discard

আরও কার্যকর করার জন্য উদ্ধৃতিগুলির মধ্যে থাকা সামগ্রীকে একটি নিয়ন্ত্রিত লুপ (পুনরাবৃত্ত পরিবর্তনের পরিবর্তে) দিয়ে বর্ণনা করা হয়েছে: [^"\\]*(?:\\.[^"\\]*)*

স্পষ্টতই যে স্ট্রিংগুলির সাথে ভারসাম্যহীন উদ্ধৃতি নেই সেগুলি মোকাবেলা করার জন্য, আপনি পরিবর্তে অধিক পরিমাণে কোয়ানটিফায়ার ব্যবহার করতে পারেন: [^"\\]*+(?:\\.[^"\\]*)*+বা অত্যধিক ব্যাকট্র্যাকিং রোধ করতে, এগুলি অনুকরণ করার জন্য একটি কার্যনির্বাহী। আপনি এমনটিও চয়ন করতে পারেন যে পরবর্তী (অরক্ষিত) উদ্ধৃতি বা স্ট্রিংয়ের সমাপ্তি অবধি উদ্ধৃত অংশটি একটি উদ্বোধনী মূল্য হতে পারে। এক্ষেত্রে প্রাপ্য কোয়ান্টিফায়ার ব্যবহার করার দরকার নেই, আপনার কেবল শেষ উদ্ধৃতিটি alচ্ছিক করা দরকার।

দ্রষ্টব্য: কখনও কখনও উদ্ধৃতিগুলি ব্যাকস্ল্যাশ দিয়ে পালানো হয় না তবে উদ্ধৃতি পুনরাবৃত্তি করে। এক্ষেত্রে বিষয়বস্তু সাবপ্যাটার্নটি দেখে মনে হচ্ছে:[^"]*(?:""[^"]*)*

নিদর্শনগুলি ক্যাপচার গ্রুপ এবং একটি ব্যাক রেফারেন্স (আমি এর মতো কিছু বোঝাতে চাইছি (["']).....\1) এর ব্যবহার এড়িয়ে চলে এবং একটি সাধারণ বিকল্প ব্যবহার করি ["']তবে শুরুতে ফ্যাক্টর হিসাবে।

পার্ল পছন্দ:

["'](?:(?<=")[^"\\]*(?s:\\.[^"\\]*)*"|(?<=')[^'\\]*(?s:\\.[^'\\]*)*')

(নোট যে (?s:...)অ ক্যাপচার গ্রুপ ভিতরে dotall / singleline মোড সুইচ করার জন্য একটি অন্বিত চিনি। এই সিনট্যাক্স সমর্থিত নয়, তাহলে আপনি সহজেই সব প্যাটার্ন জন্য এই মোড সুইচ বা ডট প্রতিস্থাপন করতে পারেন [\s\S])

(এই প্যাটার্নটি যেভাবে লিখিত হয়েছে তা সম্পূর্ণ "হস্তচালিত" এবং চূড়ান্ত ইঞ্জিনের অভ্যন্তরীণ অপ্টিমাইজেশনের অ্যাকাউন্ট নেয় না)

ইসিএমএ স্ক্রিপ্ট:

(?=["'])(?:"[^"\\]*(?:\\[\s\S][^"\\]*)*"|'[^'\\]*(?:\\[\s\S][^'\\]*)*')

পসিক্স প্রসারিত:

"[^"\\]*(\\(.|\n)[^"\\]*)*"|'[^'\\]*(\\(.|\n)[^'\\]*)*'

বা সহজভাবে:

"([^"\\]|\\.|\\\n)*"|'([^'\\]|\\.|\\\n)*'

1
পাইথন ইসিএমএ স্ক্রিপ্টটি কাঁচা স্ট্রিং ফর্ম্যাট হিসাবে গ্রহণ করে, অর্থাত "" "ইসিএমএ স্ক্রিপ্ট" ""
1

1
এটি উজ্জ্বল, আপনার ইসিএমএর সাথে নতুন লাইন থেকে বেরিয়ে আসা এবং ডাবল কোটের ভিতরে ক্যারিজের রিটার্ন নিয়ে কাজ করা খুব সহজ হয়েছিল was
ডগলাস গ্যাসকেল

@ ডগলাসগ 14 বি: ধন্যবাদ। নোট করুন যে আপনি যদি এটি জাভাস্ক্রিপ্টে ব্যবহার করতে চান তবে আপনাকে কেবল /pattern/কিছু না বাছাই করে আক্ষরিক স্বরলিপিটি ব্যবহার করতে হবে (বস্তুর স্বরলিপি পরিবর্তে new RegExp("(?=[\"'])(?:\"[^\"\\\\]*...");)
ক্যাসিমির এবং হিপলপেট

@ এয়ানআন: হ্যাঁ, তবে আপনি যদি sএখানে অপসারণ করেন তবে আপনি পার্ল সংস্করণটি ব্যবহার করতে পারেন : (?s:এবং যদি আপনি (?s)কোনও নকশায় রাখেন ।
ক্যাসিমির এবং

16

গৃহীত উত্তরের RegEx তাদের স্রোভারিং উদ্ধৃতি চিহ্নগুলি সহ: "Foo Bar"এবং "Another Value"ম্যাচ হিসাবে মানগুলি প্রদান করে ।

এখানে RegEx রয়েছে যা উদ্ধৃতি চিহ্নগুলির মধ্যে কেবল মানগুলি ফেরত দেয় (প্রশ্নকারী যেমন জিজ্ঞাসা করছিল):

শুধুমাত্র ডাবল উদ্ধৃতি (ক্যাপচার গ্রুপ # 1 এর মান ব্যবহার করুন):

"(.*?[^\\])"

একক উদ্ধৃতি (ক্যাপচার গ্রুপ # 1 এর মান ব্যবহার করুন):

'(.*?[^\\])'

উভয়ই (ক্যাপচার গ্রুপ # 2 এর মান ব্যবহার করুন):

(["'])(.*?[^\\])\1

-

সমস্ত সমর্থন পালিয়ে গেছে এবং নেস্টেড কোটস।


দয়া করে, কেন এটি কাজ করে? আমি ব্যবহার করছিলাম src="(.*)"তবে স্পষ্টতই এটি শেষ "এর আগে সমস্ত কিছু নির্বাচন করছিল, আপনার আরইজিএক্স, যদিও কেবলমাত্র src =" "বিষয়বস্তু নির্বাচন করেছে, তবে কীভাবে বুঝতে পারি না?
লুকাশ বুস্তামেন্ট

এটির সরলতার জন্য আমি এটিকে অনেক পছন্দ করি তবে এটি
উদ্ধৃতগুলির

16

অদ্ভুতভাবে, এই উত্তরগুলির কোনওটিই এমন একটি রেজেক্স তৈরি করে না যেখানে প্রত্যাবর্তিত ম্যাচটি উদ্ধৃতিগুলির অভ্যন্তরের পাঠ্য হয়, যার জন্য এটি জিজ্ঞাসা করা হয়। এমএ-ম্যাডেন চেষ্টা করে তবে পুরো ম্যাচের চেয়ে কেবল অভ্যন্তর ম্যাচটি ক্যাপচার গ্রুপ হিসাবে পায়। এটি করার একটি উপায় হ'ল:

(?<=(["']\b))(?:(?=(\\?))\2.)*?(?=\1)

এর উদাহরণগুলি এই ডেমো https://regex101.com/r/Hbj8aP/1 এ দেখা যাবে

কী এখানে শুরু (ইতিবাচক lookbehind হয় ?<=শেষ (এ) এবং ইতিবাচক lookahead ?=)। উদ্ধৃতিহীন বর্তমানের চরিত্রটির পেছনে তাকিয়ে আছে একটি উদ্ধৃতিটি অনুসন্ধান করার জন্য, যদি এটি পাওয়া যায় তবে সেখান থেকে শুরু করুন এবং তারপরে লুকেইড একটি উদ্ধৃতির জন্য সামনে চরিত্রটি যাচাই করে নিচ্ছে এবং যদি সেই চরিত্রটি বন্ধ করে পাওয়া যায়। শুরুতে ["']যে উদ্ধৃতিটি পাওয়া গেছে তার জন্য একটি গ্রুপ তৈরি করার জন্য লুকবিহীন গোষ্ঠীটি (দ্য ) বন্ধনীগুলিতে আবৃত হয়, এটি শেষের দিকে তত্ক্ষণাত ব্যবহার করা হয় এটি (?=\1)নিশ্চিত হয়ে যায় যে এটি কেবলমাত্র সংশ্লিষ্ট কোডটি খুঁজে পেলে এটি বন্ধ হয়ে যায় make

কেবলমাত্র অন্য জটিলতাটি হ'ল যেহেতু লুয়াচহেডটি শেষের উদ্ধৃতিটি গ্রাহ্য করে না, তাই এটি আবার শুরুর দিকে ফিরে পাওয়া যাবে যা একই লাইনের সমাপ্তি এবং প্রারম্ভিক উদ্ধৃতিগুলির মধ্যে পাঠ্যটির সাথে মিলে যায়। শুরুর উদ্ধৃতিতে শব্দের গণ্ডি স্থাপন ( ["']\b) এটির সাথে সহায়তা করে, যদিও আদর্শিকভাবে আমি চেহারাটির পূর্বের দিকে যেতে চাই তবে এটি সম্ভব বলে আমি মনে করি না। বিট মাঝখানে পালিয়ে যাওয়া চরিত্রগুলিকে অনুমতি দেয় আমি সরাসরি অ্যাডামের উত্তর থেকে নিয়েছি।


11

খুব দেরিতে উত্তর, তবে উত্তর দিতে পছন্দ করুন

(\"[\w\s]+\")

http://regex101.com/r/cB0kB8/1


পিএইচপি খুব ভাল কাজ করে।
প্যারাপলুই

"হোমপেজ" উভয়কে এখানে বন্দী করার একমাত্র উত্তর: স্থানীয়করণ ["হোম পেজ"] স্থানীয়করণ করুন ["হোম পৃষ্ঠা"]
জে বিলেঞ্জার

8

(["'])(?:(?=(\\?))\2.)*?\1উপরের প্যাটার্নটি কাজটি করে তবে আমি এর অভিনয় সম্পর্কে উদ্বিগ্ন (এটি খারাপ নয় তবে আরও ভাল হতে পারে)। আমার নীচে এটি 20% দ্রুত।

প্যাটার্নটি "(.*?)"কেবল অসম্পূর্ণ। এটি পড়ার জন্য প্রত্যেকের জন্য আমার পরামর্শটি কেবল এটি ব্যবহার করবেন না !!!

উদাহরণস্বরূপ এটি অনেকগুলি স্ট্রিং ক্যাপচার করতে পারে না (যদি প্রয়োজন হয় তবে আমি নীচের মতো একটি বিস্তৃত পরীক্ষা-কেস সরবরাহ করতে পারি):

স্ট্রিং = 'কেমন আছেন? আমি \'ভাল আছি , ধন্যবাদ ';

তাদের বাকিগুলি উপরেরটির মতোই "ভাল"।

আপনি যদি পারফরম্যান্স এবং যথার্থতা উভয়েরই যত্নশীল হন তবে নীচের সাথে শুরু করুন:

/(['"])((\\\1|.)*?)\1/gm

আমার পরীক্ষাগুলিতে এটি আমার দেখা প্রতিটি স্ট্রিংকে অন্তর্ভুক্ত করে তবে যদি আপনি এমন কোনও কিছু খুঁজে পান যা কাজ করে না তবে আমি আপনাকে খুশির সাথে আপডেট করব।

একটি অনলাইন রেজেক্স পরীক্ষকটিতে আমার প্যাটার্নটি পরীক্ষা করুন


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

7

উক্তিগুলি থেকে পালাতে পেরেও उद्धিত্যের মধ্যে থাকা সামগ্রীর সাথে মেলে আমার ইউজেন মিহাইলস্কুর সমাধানটি পছন্দ হয়েছিল । যাইহোক, আমি পালানোর সাথে সাথে কিছু সমস্যা আবিষ্কার করেছি এবং সেগুলি সমাধানের জন্য নীচের রেইগেক্স নিয়ে এসেছি:

(['"])(?:(?!\1|\\).|\\.)*\1

এটি কৌশলটি করে এবং এটি এখনও বেশ সহজ এবং বজায় রাখা সহজ।

ডেমো (আরও কয়েকটি টেস্ট-কেস সহ; এটি ব্যবহার করতে নির্দ্বিধায় এবং এটিতে প্রসারিত করুন)।


দ্রষ্টব্য: আপনি যদি কেবলমাত্র এমন সামগ্রী এড়িয়ে চান মধ্যে সম্পূর্ণ খেলা (কোট $0), এবং কর্মক্ষমতা শাস্তি ব্যবহারের ভীত নয়:

(?<=(['"])\b)(?:(?!\1|\\).|\\.)*(?=\1)

দুর্ভাগ্যক্রমে, অ্যাঙ্কর হিসাবে উদ্ধৃতিগুলি ছাড়াই, আমাকে একটি বাউন্ডারি যুক্ত করতে হয়েছিল \bযা শুরুর উদ্ধৃতি দেওয়ার পরে স্পেস এবং অ-শব্দ সীমানা অক্ষরের সাথে ভাল খেলতে পারে না।

বিকল্পভাবে, কেবল একটি গোষ্ঠী$2 যুক্ত করে স্ট্রিং ফর্মটি বের করে প্রাথমিক সংস্করণটি সংশোধন করুন :

(['"])((?:(?!\1|\\).|\\.)*)\1

পিপিএস: যদি আপনার ফোকাসটি কেবল দক্ষতার দিকে থাকে তবে ক্যাসিমির এবং হিপপলিটের সমাধানটি নিয়ে যান ; এটি একটি ভাল।


পর্যবেক্ষণ: -দ্রাঘিমাংশ স্থানাঙ্কের মতো দ্বিতীয় রেজেক্স একটি বিয়োগ চিহ্ন সহ একটি মান মিস করে ।
ক্রাউড কোডার

আমি কিছুই পরিবর্তন করিনি। আপনি যদি বিষয়টি পর্যবেক্ষণ না করেন তবে এটি আমি ব্যবহার করছি রেগেক্সের স্বাদ। আমি regex101site ব্যবহার করছিলাম, আমার মনে হয় পিএইচপি স্টাইল রেজেক্স।
ক্রাউড কোডার

আমি যা বলছি তার ডেমো এখানে। আমি এটি দ্রাঘিমাংশ (-96.74025) মেলানোর আশা করছিলাম তবে তা হয় না।
ক্রাউড কোডার

@ ক্রাউডকোডার আপনাকে ধন্যবাদ হ্যাঁ, এটি সীমানা শব্দের কারণে ঘটে যা অ্যাঙ্কর হিসাবে কাজ করে এবং ওভারল্যাপিং ম্যাচগুলি এড়াতে সহায়তা করে তবে আপনার ইনপুটটি দিয়ে সুন্দর খেলবে না। একটি অতিরিক্ত গ্রুপ হ'ল আপডেট উত্তরে উল্লিখিত হিসাবে ভাল বিকল্প।
wp78de

6

এই সংস্করণ

  • পালানো উদ্ধৃতি জন্য অ্যাকাউন্ট
  • ব্যাকট্র্যাকিং নিয়ন্ত্রণ করে

    /(["'])((?:(?!\1)[^\\]|(?:\\\\)*\\[^\\])*)\1/

এই ধারন একাধিক স্ট্রিং এবং না স্ট্রিং উদাহরণস্বরূপ সঠিকভাবে একটি ডবল ব্যাকস্ল্যাশ হ্যান্ডেল করতে, বলে মনে হচ্ছে না: foo বিন্যাস 'stri \\ NG 1' বার 'STRING 2' এবং 'স্ট্রিং 3' Debuggex ডেমো
miracle2k

আপনি একটি অক্ষর শ্রেণিতে ব্যাক রেফারেন্স ব্যবহার করতে পারবেন না।
হামজা

5

আরও উত্তর! আমি ব্যবহৃত সমাধানটি এখানে

\"([^\"]*?icon[^\"]*?)\"

TLDR; আপনি যা বলেছিলেন তা উদ্ধৃতি এবং ভয়েলা যা খুঁজছেন তার সাথে
শব্দ আইকনটি প্রতিস্থাপন করুন !


এটি যেভাবে কাজ করে তা হ'ল কীওয়ার্ডটি সন্ধান করে এবং উদ্ধৃতিগুলির মধ্যে আর কী রয়েছে তা যত্ন করে না। ইজি:
id="fb-icon"
id="icon-close"
id="large-icon-close"
রেজেক্স একটি উদ্ধৃতি চিহ্নের জন্য সন্ধান করে "
তারপরে এটি কোনও সম্ভাব্য অক্ষরগুলির গোষ্ঠী "
সন্ধান করবে যতক্ষণ না এটি পাওয়া যায় icon
এবং অক্ষরগুলির কোনও সম্ভাব্য গোষ্ঠী যা এটি না "
হয় তারপরে একটি সমাপ্তির সন্ধান করে"


1
আপনাকে অনেক ধন্যবাদ. প্রতিটি ঘটনা প্রতিস্থাপন করতে সক্ষম ছিল name="value"সঙ্গে name={"value"}এই উত্তর এর Regex আয় যেহেতু icon/ value(গৃহীত উত্তর অসদৃশ) দ্বিতীয় দল হিসেবে। খুঁজুন : =\"([^\"]*?[^\"]*?)\" প্রতিস্থাপন :={"$1"}
Palisand

মন বোঝাচ্ছে ডাউনটা? এটি কিছু পরিস্থিতি থেকে ভাল কাজ করে।
জেমস হ্যারিংটন

তুমি কি আমাকে জবাব দিচ্ছ?
পলিস্যান্ড

@ প্যালিস্যান্ড অন্য দিন কোনও ব্যাখ্যা ছাড়াই এই পোস্টটিকে কেউ ভোট দিয়ে নিচে ভোট দেয়নি।
জেমস হ্যারিংটন

এই একমাত্র উত্তর বলে মনে হচ্ছে যা উদ্ধৃতিগুলির মধ্যে একটি নির্দিষ্ট পাঠ্য খুঁজে পেয়েছে
টপ-মাস্টার

4

আমি অক্সম্যানের আরও বিস্তৃত সংস্করণটি পছন্দ করেছিলাম তবে এতে কিছুটা সমস্যা ছিল (এটি উদাহরণের সাথে মেলে না

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

3
string = "\" foo bar\" \"loloo\""
print re.findall(r'"(.*?)"',string)

এই চেষ্টা করে দেখুন, কবজির মতো কাজ করে !!!

\ স্কিপ অক্ষর নির্দেশ করে


যদি সেই প্রথম লাইনটি প্রকৃত পাইথন কোড হয় তবে এটি স্ট্রিং তৈরি করতে চলেছে " foo bar" "loloo"। আমি সন্দেহ আপনি মোড়ানো একটি কাঁচা স্ট্রিং মত Regex করেছিল বোঝানো: r'"\" foo bar\" \"loloo\""'। যখনই উপযুক্ত হয় দয়া করে এসও এর দুর্দান্ত ফর্ম্যাটিং ক্ষমতাটি ব্যবহার করুন । এটি কেবল প্রসাধনী নয়; আপনি যদি সেগুলি ব্যবহার না করেন তবে আপনি কী বলতে চাইছেন তা আমরা আক্ষরিকভাবে বলতে পারি না। এবং স্ট্যাক ওভারফ্লোতে স্বাগতম !
অ্যালান মুর

অ্যালান পরামর্শের জন্য ধন্যবাদ, আমি এই সম্প্রদায়ের কাছে আসলেই নতুন, পরের বার আমি অবশ্যই এই সব মনে রাখব ... আন্তরিক ক্ষমা চাই।
মবম্যান

2

অ্যাডামের উত্তরের বিপরীতে, আমার কাছে একটি সহজ তবে কাজ করা আছে:

(["'])(?:\\\1|.)*?\1

আপনি যদি এই জাতীয় উদ্ধৃতিতে সামগ্রী পেতে চান তবে কেবল বন্ধনী যুক্ত করুন:

(["'])((?:\\\1|.)*?)\1

তারপরে $1কোট চরটি এবং $2মেলে সামগ্রীর স্ট্রিংয়ের সাথে।


1
echo 'junk "Foo Bar" not empty one "" this "but this" and this neither' | sed 's/[^\"]*\"\([^\"]*\)\"[^\"]*/>\1</g'

এর ফলস্বরূপ:> ফু বার <> <> তবে এটি <

এখানে আমি << এর স্পষ্টতার জন্য ফলাফলের স্ট্রিংটি দেখিয়েছি এবং অদ্ভুত সংস্করণ ব্যবহার করে এই সেড কমান্ডটি ব্যবহার করে আমরা প্রথমে তার আগে এবং পরে আবর্জনা ফেলে দিই এবং এরপরে "" অংশের সাথে এটি প্রতিস্থাপন করব এর <> s দ্বারা এটিকে ঘিরে।


1

গ্রেগ এইচ থেকে আমি আমার প্রয়োজন অনুসারে এই রেজেেক্স তৈরি করতে সক্ষম হয়েছি।

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

যেমন "পরীক্ষা" "টেস্ট 2" এর সাথে মেলে না match

reg = r"""(['"])(%s)\1"""
if re.search(reg%(needle), haystack, re.IGNORECASE):
    print "winning..."

শিকারী


1

আপনি যদি ডট সিনট্যাক্সের মতো কেবল একটি নির্দিষ্ট প্রত্যয়যুক্ত স্ট্রিংগুলি সন্ধান করার চেষ্টা করছেন তবে আপনি এটি চেষ্টা করতে পারেন:

\"([^\"]*?[^\"]*?)\".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"


1

মাইক্রোসফ্ট ভিবিএ কোডারদের সাবসেটের জন্য পরিপূরক উত্তরটি কেবল একটি গ্রন্থাগার ব্যবহার করে 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

0

আমার জন্য এটি কাজ করেছে:

|([\'"])(.*?)\1|i

আমি এই মত একটি বাক্যে ব্যবহার করেছি:

preg_match_all('|([\'"])(.*?)\1|i', $cont, $matches);

এবং এটি দুর্দান্ত কাজ করেছে।


এই পদ্ধতির একটি দুর্বলতা হ'ল যখন কোনও স্ট্রিংটি একক উদ্ধৃতি দিয়ে শুরু হয় এবং ডাবল উদ্ধৃতি বা তার বিপরীতে শেষ হয়।
ঘোপ্পের 21

এটি "@ ভুলে যাবেন না" ধরার সমস্যাও রয়েছে - এটি "ডন" এর পরে থামে।
বেনি নিউজবাউয়ার

0

উপরের সমস্ত উত্তর ভাল .... যদি তারা সমস্ত ইউনিকোড অক্ষর সমর্থন করে না!ইসিএমএ স্ক্রিপ্টে (জাভাস্ক্রিপ্ট)

আপনি যদি নোড ব্যবহারকারী হন তবে আপনি স্বীকৃত উত্তরের পরিবর্তিত সংস্করণটি চাইবেন যা সমস্ত ইউনিকোড অক্ষরকে সমর্থন করে:

/(?<=((?<=[\s,.:;"']|^)["']))(?:(?=(\\?))\2.)*?(?=\1)/gmu

এখানে চেষ্টা করুন


1
অ-ইউনিকোড চরিত্রটি কী? এএফআইএইইকে ইউনিকোড সমস্ত চরিত্রকে কভার করে ।
টোটো

1
আপনি কেন এটি একটি জাভাস্ক্রিপ্ট প্রশ্ন অনুমান? তদুপরি, সমস্ত ব্রাউজারে লুকবিহীন সমর্থিত নয়, রিজেক্স 101 নিক্ষেপ করেছে? The preceding token is not quantifiable
টোটো

@ টোটো, আমার অর্থ "সমস্ত ইউনিকোড চরিত্রকে সমর্থন করে না"। ধন্যবাদ. যদিও প্রশ্নটি সাধারণভাবে রেজেক্স সম্পর্কে, আমি কেবল জোর দিয়ে বলতে চাই না যে শব্দের সীমানা যুক্তির ব্যবহার জাভাস্ক্রিপ্টে অযাচিত আচরণের কারণ হতে পারে। এবং অবশ্যই, যখন জাভাস্ক্রিপ্টগুলি সাধারণত ব্রাউজারের জন্য থাকে তবে নোডও রয়েছে।
ডোনভান পি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.