سؤال

كيفية استخدام gsub مع أكثر من 9 backreferences?أتوقع الإخراج في المثال أدناه أن "ه ، ز ، ط ، ي ، س".

> test <- "abcdefghijklmnop"
> gsub("(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)", "\\5, \\7, \\9, \\10, \\15", test, perl = TRUE)
[1] "e, g, i, a0, a5"
هل كانت مفيدة؟

المحلول

التعبير العادية مع وR اللغة :

<اقتباس فقرة>   

ويمكنك استخدام backreferences \1 من خلال \9 في النص البديل لمعاودة النص من قبل مجموعة التقاط . لا يوجد رمز نص بديل للمباراة بشكل عام. ضع التعبير المعتاد بأكمله في مجموعة الالتقاط ثم استخدام \1.

ولكن مع PCRE يجب أن تكون قادرا على استخدام المجموعات المسماة . وذلك في محاولة (?P< <م> name > <م> regex ) لتسمية groupd و(?P= <م> name ) كما backreference.

نصائح أخرى

استخدم strsplit بدلا من ذلك:

test <- "abcdefghijklmnop"
strsplit(test, "")[[1]][c(5, 7, 9, 10, 15)]

وكان فهمي أن \ 10 فإننا يفهم على أنه backreference 0 يليه رقم 1. اعتقد 9 هو الحد الأقصى.

وظائف stri_replace_*_regex من stringi حزمة ليس لديها مثل هذه القيود:

library("stringi")
stri_replace_all_regex("abcdefghijkl", "(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)", "$10$1$11$12")
## [1] "jakl"

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

stri_replace_all_regex("abcdefghijkl", "(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)", "$10$1$1\\1$12")
## [1] "jaa1l"

وفقا هذا الموقع, والظهر المراجع \10 \99 يعمل على بعض اللغات ، ولكن ليس أكثر.

تلك التي ذكرت أن العمل

وهذا القيد إلى 9 backreferences تقتصر على sub() وgsub()functions، وليس إلى وظائف مثل grep() وما شابه ذلك. الدعم لأكثر من 9 backreferences في R يعني ضمنا باستخدام PCRE العادية التعبير (أي حجة perl=TRUE)؛ ولكن، حتى مع هذا الخيار، شبه () وgsub () وظائف لا يعتمد عليه.

وثائق R صريحة حول هذه النقطة: انظر ?regexp

There can be more than 9 backreferences (but the replacement in sub can
only refer to the first 9).
لا بد

وعلاوة على ذلك فكرة استخدام الجماعات القبض على اسمه للتحايل على هذا القيد أن تفشل منذ لا يتم اعتماد مجموعة التقاط اسمه مع فرعي () وظائف.

regexpr and gregexpr support ‘named capture’. If groups are named,
e.g., "(?<first>[A-Z][a-z]+)" then the positions of the matches are also
returned by name. (Named backreferences are not supported by sub.)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top