سؤال

أستخدم مجموعات لمحاولة مطابقة نمط معين ، وأنا لا أحصل على النتائج التي أتوقعها تمامًا. نمط الاهتمام على النحو التالي:

([0-9]+(\.[0-9]+)+)

لسلسلة 1.23, ، انا حصلت $1=1.23, ، و $2=.23 الذي يجعله منطقيا بالنسبة لي.

ولكن للسلسلة 1.2.3, ، انا حصلت $1=1.2.3 و $2=.3, ، حيث أتوقع $2=.2.3, ، لأن مجموعتها هي نقطة عشرية ورقمية ، تتكرر.

هل يمكن لأحد أن يشرح لي كيف يعمل هذا؟ شكرًا لك!

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

المحلول 2

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

http://blogs.perl.org/users/sirhc/2012/05/repeated-capturing-and-parsing.html

في مثالك ، $1 اعواد الكبريت 1.2.3. كما يتكرر النمط ، $2 سيتم ضبطه على .2 حتى المباراة النهائية .3

نصائح أخرى

عند استخدام مجموعات التقاط مع الكمي ، فقط الاخير سيتم تخزين تكرار النمط الذي تم التقاطه.

ربما يلبي هذا Regex احتياجاتك:

\b(\d+)((?:\.\d+)+)\b

هذا regex يفصل تسلسل عدد صحيح رئيسي عن مكوناته الكسرية المتكررة.

(كما هو موضح في @shth ، يرجى مراعاة ذلك \d مايو تطابق المزيد من الشخصيات مما تنوي. إذا كان هذا هو الحال ، فاستخدم فئة الأحرف [0-9] بدلا من ذلك أو استخدم /a المعدل.)

إليك برنامج Perl الذي يوضح هذا regex على مجموعة بيانات عينة. (انظر أيضا عرض حي.)

#!/usr/bin/perl -w

use strict;
use warnings;

while (<DATA>) {
    chomp;

    # A - A sequence of digits
    # B - A period and a sequence of digits
    # C - Repeat 'B'.

    if (/\b(\d+)((?:\.\d+)+)\b/) {
#           ^^^     ^^^^^
#            A        B
#                   ^^^^^^^
#                      C

        print "[$1]  [$2]\n";
    }
}

__END__
1.23
123.456
1.2.3
1.22.333.444

الناتج المتوقع:

[1]  [.23]
[123]  [.456]
[3]  [.2.3]
[4]  [.22.333.444]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top