ההבדל בין Java Matcher find () ו- matches ()

1. סקירה כללית

כשעובדים עם ביטויים רגולריים ב- Java, אנו בדרך כלל רוצים לחפש נתון ברצף תווים תבנית. כדי להקל על כך, ה- API Regular Expressions API של Java מספק את ה- שידוך בכיתה, שבה נוכל להתאים ביטוי קבוע נתון לטקסט.

ככלל, כמעט תמיד נרצה להשתמש באחת משתי שיטות פופולריות של ה- שידוך מעמד:

  • למצוא()
  • התאמות()

במדריך מהיר זה נלמד על ההבדלים בין שיטות אלה באמצעות סט פשוט של דוגמאות.

2. ה למצוא() שיטה

במילים פשוטות, ה למצוא() שיטה מנסה למצוא את המופע של תבנית regex בתוך מחרוזת נתונה. אם נמצאות מספר מחרוזות במחרוזת, אז השיחה הראשונה אל למצוא() יקפוץ למופע הראשון. לאחר מכן, כל שיחה שלאחר מכן אל למצוא() השיטה תעבור למופע ההתאמה הבא, אחד אחד.

בואו נדמיין שאנחנו רוצים לחפש במחרוזת שסופקה "להתראות 2019 וברוך הבא 2020" למספרים בני ארבע ספרות בלבד.

לשם כך נשתמש בתבנית "\ d \ d \ d \ d" :

@ מבחן פומבי בטל כאשר FindFourDigitWorks_thenCorrect () {string stringPattern = Pattern.compile ("\ d \ d \ d \ d"); התאמה m = stringPattern.matcher ("להתראות 2019 וברוך הבא 2020"); assertTrue (m.find ()); assertEquals (8, m.start ()); assertEquals ("2019", m.group ()); assertEquals (12, m.end ()); assertTrue (m.find ()); assertEquals (25, m.start ()); assertEquals ("2020", m.group ()); assertEquals (29, m.end ()); assertFalse (m.find ()); }

מכיוון שיש לנו שתי התרחשויות בדוגמה זו - 2019 ו 2020 - ה למצוא() השיטה תחזור נָכוֹן פעמיים, וברגע שהוא יגיע לסוף אזור המשחק, הוא יחזור שֶׁקֶר.

ברגע שנמצא התאמה כלשהי, נוכל להשתמש בשיטות כמו הַתחָלָה(), קְבוּצָה(), ו סוֹף() כדי לקבל פרטים נוספים על המשחק, כפי שמוצג לעיל.

ה הַתחָלָה() השיטה תתן את אינדקס ההתחלה של ההתאמה, סוֹף() יחזיר את האינדקס האחרון של הדמות לאחר סיום המשחק, ו קְבוּצָה() יחזיר את הערך בפועל של ההתאמה.

3. ה מצא (int) שיטה

יש לנו גם את הגרסה העמוסה של שיטת החיפוש - מצא (int). זה לוקח את אינדקס ההתחלה כפרמטר ו רואה באינדקס ההתחלה כנקודת ההתחלה לחיפוש אחר התרחשויות במחרוזת.

בואו נראה כיצד להשתמש בשיטה זו באותה דוגמה כמו קודם:

@Test הציבור בטל givenStartIndex_whenFindFourDigitWorks_thenCorrect () {string stringPattern = Pattern.compile ("\ d \ d \ d \ d"); התאמה m = stringPattern.matcher ("להתראות 2019 וברוך הבא 2020"); assertTrue (m.find (20)); assertEquals (25, m.start ()); assertEquals ("2020", m.group ()); assertEquals (29, m.end ()); }

כפי שסיפקנו אינדקס התחלה של 20אנו יכולים לראות כי כעת נמצא רק התרחשות אחת - 2020, המתרחש כצפוי לאחר אינדקס זה. וכמו שקורה למצוא(), אנו יכולים להשתמש בשיטות כמו הַתחָלָה(), קְבוּצָה(), ו סוֹף() כדי לחלץ פרטים נוספים על ההתאמה.

4. ה התאמות() שיטה

מצד שני, ההתאמות() השיטה מנסה להתאים את כל המחרוזת לדפוס.

לאותה דוגמה, התאמות() יחזור שֶׁקֶר:

@ מבחן ציבורי בטל כאשרMatchFourDigitWorks_thenFail () {string stringPattern = Pattern.compile ("\ d \ d \ d \ d"); התאמה m = stringPattern.matcher ("להתראות 2019 וברוך הבא 2020"); assertFalse (m.matches ()); } 

הסיבה לכך היא שהיא תנסה להתאים "\ d \ d \ d \ d" נגד כל המחרוזת "להתראות 2019 וברוך הבא 2020 "לא כמו ה למצוא() ו מצא (int) שיטות, שתיהן ימצאו את המופע של התבנית בכל מקום בתוך המחרוזת.

אם נשנה את המחרוזת למספר בן ארבע הספרות “2019”, לאחר מכן התאמות() יחזור נָכוֹן:

@ מבחן ציבורי בטל כאשרMatchFourDigitWorks_thenCorrect () {string stringPattern = Pattern.compile ("\ d \ d \ d \ d"); התאמה m = stringPattern.matcher ("2019"); assertTrue (m.matches ()); assertEquals (0, m.start ()); assertEquals ("2019", m.group ()); assertEquals (4, m.end ()); assertTrue (m.matches ()); }

כפי שמוצג לעיל, אנו יכולים גם להשתמש בשיטות כמו הַתחָלָה(), קְבוּצָה(), ו סוֹף() לאסוף פרטים נוספים על המשחק. נקודה מעניינת אחת לציין היא כי התקשרות למצוא() מספר פעמים עשוי להחזיר תפוקה שונה לאחר קריאה לשיטות אלה, כפי שראינו בדוגמה הראשונה שלנו, אך התאמות() תמיד יחזיר את אותו הערך.

5. מסקנה

במאמר זה ראינו כיצד למצוא(), מצא (int), ו התאמות() נבדלים זה מזה עם דוגמה מעשית. ראינו גם איך שיטות שונות כמו הַתחָלָה(), קְבוּצָה(), ו סוֹף() יכול לעזור לנו לחלץ פרטים נוספים על התאמה נתונה.

כמו תמיד, קוד המקור המלא של המאמר זמין באתר GitHub.