Regex Line حسب الخط: كيفية تطابق اقتباسات ثلاثية ولكن لا اقتباسات مزدوجة

StackOverflow https://stackoverflow.com/questions/1494929

  •  18-09-2019
  •  | 
  •  

سؤال

أحتاج إلى التحقق لمعرفة ما إذا كانت سلسلة من الكلمات / الحروف / الحروف الأخرى، تحتوي فقط على مجموعة واحدة فقط من الاقتباسات المزدوجة الثلاثية (أي "")، ولكن يمكن أن تحتوي أيضا على علامات اقتباس مزدوجة واحدة (") ونقلية مزدوجة مزدوجة ( "")، باستخدام Regex. ليس لديها الكثير من النجاح حتى الآن.

هل كانت مفيدة؟

المحلول

يمكن ل Regex مع Lookahead السلبية القيام بذلك:

(?!.*"{3}.*"{3}).*"{3}.*

جربته مع هذه الخطوط من رمز Java:

String good = "hello \"\"\" hello \"\" hello ";
String bad = "hello \"\"\" hello \"\"\" hello ";
String regex = "(?!.*\"{3}.*\"{3}).*\"{3}.*";
System.out.println( good.matches( regex ) );
System.out.println( bad.matches( regex ) );

... مع الإخراج:

true
false

نصائح أخرى

حاول استخدام عدد مشغل الحوادث لتتناسب مع ثلاثة اقتباسات مزدوجة تماما.

  • \"{3}
  • ["]{3}
  • [\"]{3}

لقد فحصت بسرعة باستخدام http://www.regextester.com/, ، يبدو أن تعمل بشكل جيد.

كيف يمكنك ترجمة Regex بشكل صحيح في لغتك الاختيار قد تختلف، على الرغم من!

يعتمد على لغتك، ولكن يجب عليك فقط مطابقته لثلاثة اقتباسات مزدوجة (على سبيل المثال، /\"{3}/) ثم عد المباريات لمعرفة ما إذا كان هناك واحد بالضبط.

من المحتمل أن يكون هناك الكثير من الطرق للقيام بذلك، لكن أحدهما بسيط هو مجرد البحث عن تكرارات متعددة من الاقتباسات الثلاثية ثم تعكس التعبير العادي. إليك مثال من بيرل:

use strict;
use warnings;

my $match = 'hello """ hello "" hello';
my $no_match = 'hello """ hello """ hello';
my $regex = '[\"]{3}.*?[\"]{3}';

if ($match !~ /$regex/) {
    print "Matched as it should!\n";
}
if ($no_match !~ /$regex/) {
    print "You shouldn't see this!\n";
}

ما النواتج:

Matched as it should!

في الأساس، فأنت تخبره بالعثور على الشيء الذي لا تريده، ثم إنهاء الحقيقة. نأمل أن تكون المنطقية. يمكن أن تساعدك على تحويل المثال إلى لغة أخرى إذا كنت بحاجة إلى مساعدة.

قد تكون هذه بداية جيدة بالنسبة لك.

^(\"([^\"\n\\]|\\[abfnrtv?\"'\\0-7]|\\x[0-9a-fA-F])*\"|'([^'\n\\]|\\[abfnrtv?\"'\\0-7]|\\x[0-9a-fA-F])*'|\"\"\"((?!\"\"\")[^\\]|\\[abfnrtv?\"'\\0-7]|\\x[0-9a-fA-F])*\"\"\")$

انظر ذلك في العمل في Regex101.com..

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top