كيف يمكنني العثور على رسائل متكررة مع بيرل regex?

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

  •  05-07-2019
  •  | 
  •  

سؤال

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

booooooot or abbott

لن أعرف الرسالة أنا أبحث عن وقت مبكر.

هذا هو السؤال الذي طرح في المقابلات ثم سأل في المقابلات.ليس الكثير من الناس على أنها صحيحة.

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

المحلول

ويمكنك العثور على أي بريد إلكتروني، ثم استخدم \1 لتجد أن الرسالة نفسها مرة ثانية (أو أكثر). إذا كنت بحاجة فقط لمعرفة الرسالة، ثم $1 واحتوائه. وإلا يمكنك سلسلة المباراة الثانية على الأولى.

my $str = "Foooooobar";

$str =~ /(\w)(\1+)/;

print $1;
# prints 'o'
print $1 . $2;
# prints 'oooooo'

نصائح أخرى

وأعتقد أنك تريد فعلا هذا بدلا من "\ ث" كما يتضمن أرقام وتسطير.

([a-zA-Z])\1+

وطيب، طيب، ويمكنني أن تأخذ تلميحا ليون. استخدام هذا لليونيكود في العالم أو الأشياء POSIX.

([[:alpha:]])\1+

وأعتقد باستخدام backreference ستعمل:

(\w)\1+

و\w هو في الأساس [a-zA-Z_0-9] حتى إذا كنت ترغب فقط لمطابقة رسائل بين A و Z (حالة insensitively)، واستخدام [a-zA-Z] بدلا من ذلك.

(تحرير: أو، مثل Tanktalus المذكورة في تعليقه (وكما فعل آخرون قد أجبت أيضا)، [[:alpha:]] <م>، وهو-لغة حساسة)

استخدم \ N للإشارة إلى الجماعات السابقة:

/(\w)\1+/g

وأنت قد تريد أن تأخذ الرعاية لما يعتبر بريد إلكتروني، وهذا يعتمد على بلدك. وسوف تستخدم ISO اللاتينية-1 تسمح أحرف اللغة الغربية معلمة لتكون مطابقة كما الحروف. في البرنامج التالي، اللغة الافتراضية لا تعترف é، وبالتالي <م> كري فشل للمباراة. غير تعليق رمز الإعداد المحلي، وبعد ذلك تبدأ لمطابقة.

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

وهذا قد يكون من الأسهل فهم عن طريق صياغة أنها على السؤال "ما التعبير العادية يطابق أي أرقام إلا 3؟"، والجواب هو / [^ \ D3] /.

#! /usr/local/bin/perl

use strict;
use warnings;

# uncomment the following three lines:
# use locale;
# use POSIX;
# setlocale(LC_CTYPE, 'fr_FR.ISO8859-1');

while (<DATA>) {
    chomp;
    if (/([^\W_0-9])\1+/) {
        print "$_: dup [$1]\n";
    }
    else {
        print "$_: nope\n";
    }
}

__DATA__
100
food
créé
a::b

والتعليمات البرمجية التالية سيعود جميع الشخصيات التي تكرار أي وقت مضى مرتين أو أكثر.

وبلدي $ شارع = "SSSannnkaaarsss"؛

والطباعة $ شارع = ~ / (\ ث) \ 1 + / ز؛

وفقط لركلات، نهجا مختلفا تماما:

if ( ($str ^ substr($str,1) ) =~ /\0+/ ) {
    print "found ", substr($str, $-[0], $+[0]-$-[0]+1), " at offset ", $-[0];
}

لمعلوماتك جانبا من RegExBuddy حقيقي مفيد موقع مجاني اختبار التعبيرات العادية هو RegExr في gskinner.com.مقابض ([[:alpha:]])(\1+) بشكل جيد.

وماذا عن:

(\w)\1+

والجزء الأول يجعل مجموعة لم حول حرف، ثم الإسناد الخلفي يبدو ذلك الحرف نفسه.

وأعتقد أن هذا يجب أن تعمل أيضا:

و((\w)(?=\2))+\2

/(.)\\1{2,}+/u

'ش' معدل مطابقة مع يونيكود

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