هل هناك طريقة لاستخدام قائمة معلمات سلسلة مع تعبير عادي (مع المجموعات) لبناء سلسلة جديدة؟

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

  •  06-07-2019
  •  | 
  •  

سؤال

ودعونا نقول على سبيل المثال أن لدي تعبير عادي مثل هذا:

"The quick (red|brown|blue|yellow) fox (jumps|leaps) over the lazy (dog|cat)."

وهذه التعابير المنطقية له 3 عناصر مجمعة - اذا كان يقابل ضد سلسلة معينة، فإن المعهد التعابير المنطقية تسمح لك بسهولة لاستخراج قيمة داخل كل مجموعة

.

والآن دعونا نقول لدي 3 سلاسل:

["red", "leaps","cat"]

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

وأنا أبحث للقيام بذلك في جاوة - أنا متأكد تماما java.util.regex لا يدعم هذا، ولكنني اعتقدت ربما سيكون هناك ليب 3rd الطرف من هناك يمكن أن نسمح لهذا أن يتم ذلك. يمكن لأي شخص أن تعطيني بعض المؤشرات؟

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

المحلول

وطالما يمكنك القيام به دون الجماعات التقاط متداخلة يمكنك ببساطة استخدام المزيد من التعابير المنطقية لاسترداد الحرفية:

String[] strings = new String[] { "red", "leaps", "dog" };
String[] literals = new String("The quick (red|brown|blue|yellow) fox " +
    "(jumps|leaps) over the lazy (dog|cat).").split("(?=[^\\\\])\\(.*?\\)");

StringBuilder sb = new StringBuilder(literals[0]);
for(int i = 0; i < strings.length; i++) {
    sb.append(strings[i]);
    sb.append(literals[i + 1]);
}

// => sb.toString();

نصائح أخرى

ومعظم تطبيقات التعبير العادي تسمح لك أن تفعل شيئا من هذا القبيل في البحث والاستبدال:

s/The quick (red|brown|blue|yellow) fox (jumps|leaps) over the lazy (dog|cat)/The quick $1 fox $2 over the lazy $3/
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top