התאמת מחרוזות שאינן תלויות רישיות ב- Java

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

ישנן דרכים רבות לבדוק אם א חוּט מכיל תשתית. במאמר זה, אנו מחפשים משטחים בתוך a חוּט תוך התמקדות בפתרון לעקיפת הבעיה שאיננו רגיש למקרה String.contains () בג'אווה. והכי חשוב, נספק דוגמאות כיצד לפתור בעיה זו.

2. הפיתרון הפשוט ביותר: String.toLowerCase

הפיתרון הפשוט ביותר הוא באמצעות String.toLowerCase (). במקרה זה, נעבור את שני המיתרים לאותיות קטנות ואז נשתמש ב מכיל () שיטה:

assertTrue (src.toLowerCase (). מכיל (dest.toLowerCase ()));

אנחנו יכולים גם להשתמש String.toUpperCase () וזה יספק את אותה תוצאה.

3. מחרוזת. משחקים עם ביטויים רגילים

אפשרות נוספת היא באמצעות String.matches () עם ביטויים קבועים:

assertTrue (src.matches ("(? i). *" + dest + ". *"));

ה התאמות() השיטה לוקחת Sטרינג לייצג את הביטוי הרגולרי. (?אני) מאפשר חוסר רגישות למקרים ו .* משתמש בכל תו למעט מעברי שורות.

4. String.regionMatches

אנחנו יכולים גם להשתמש String.regionMatches (). זה בודק אם שניים חוּט אזורים תואמים, משתמשים נָכוֹן בשביל ה התעלם ממקרה פָּרָמֶטֶר:

תהליך בוליאני סטטי ציבורי RegionMatches (String src, String dest) {for (int i = src.length () - dest.length (); i> = 0; i--) if (src.regionMatches (true, i, dest, 0, dest.length ())) להחזיר נכון; להחזיר כוזב; }
assertTrue (processRegionMatches (src, dest));

כדי לשפר את הביצועים, הוא מתחיל להתאים את האזור, תוך התחשבות באורך היעד חוּט. ואז, זה מקטין את החזרה.

5. תבנית עם ה CASE_INSENSITIVE אוֹפְּצִיָה

ה java.util.regex.Pattern class מספק לנו דרך להתאים מחרוזות באמצעות שידוך () שיטה. במקרה זה, אנו יכולים להשתמש ב- ציטוט() שיטה להימלט מכל תווים מיוחדים, ואת CASE_INSENSITIVE דֶגֶל. בואו נסתכל:

assertTrue (Pattern.compile (Pattern.quote (dest), Pattern.CASE_INSENSITIVE) .matcher (src) .find ());

6. אפאצ'י קומונס StringUtils.containsIgnoreCase

לבסוף ננצל את Apache Commons StringUtils מעמד:

assertTrue (StringUtils.containsIgnoreCase (src, dest));

7. השוואת ביצועים

כמו במאמר כללי זה אודות בדיקת מיתרים באמצעות מכיל בשיטה, השתמשנו במסגרת קוד פתוח Java Microbenchmark Harness (JMH) ל- להשוות את ביצועי השיטות בננו שניות:

  1. תבנית CASE_INSENSITIVE ביטוי רגיל: 399.387 ns
  2. מחרוזת toLowerCase: 434.064 ns
  3. Apache Commons StringUtils: 496.313 ns
  4. התאמות אזור מחרוזות: 718.842 ns
  5. התאמת מחרוזות עם ביטוי רגיל: 3964.346 ns

כפי שאנו רואים, המנצח הוא תבנית עם ה CASE_INSENSITIVE דגל מופעל, ואחריו צמוד toLowerCase (). הבחנו גם בשיפור ברור בביצועים בין Java 8 ל- Java 11.

8. מסקנה

במדריך זה בדקנו כמה דרכים שונות לבדוק חוּט עבור המצע, תוך התעלמות מהמקרה בג'אווה.

הסתכלנו באמצעות String.toLowerCase () ו toUpperCase (), String.matches (), String.regionMatches (), Apache Commons StringUtils.containsIgnoreCase (), ו תבנית. התאמה (). מצא ().

כמו כן, הערכנו את הביצועים של כל פתרון ומצאנו כי באמצעות ה- לְלַקֵט() שיטה מ java.util.regex.Pattern עם ה CASE_INSENSITIVE דגל ביצע את הטוב ביותר.

כמו תמיד, הקוד זמין ב- GitHub.