התאמת מחרוזות שאינן תלויות רישיות ב- 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) ל- להשוות את ביצועי השיטות בננו שניות:
- תבנית CASE_INSENSITIVE ביטוי רגיל: 399.387 ns
- מחרוזת toLowerCase: 434.064 ns
- Apache Commons StringUtils: 496.313 ns
- התאמות אזור מחרוזות: 718.842 ns
- התאמת מחרוזות עם ביטוי רגיל: 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.