2011-02-10 3 views
5

Я запускаю программу сравнения, и в тот момент, когда он проводит прямое сравнение «строка-строка», и если они являются точным соответствием, то выводит, что они соответствуют.Есть ли такая вещь, как символ подстановки в Java?

Ну, я надеялся, чтобы добавить дополнительную функцию, которая позволяла «схожести» ...

так, например:

String em1 = "52494646"; 
String em2 = "52400646"; 


if (em1.equals(em2)){ 
    output.writeUTF(dir + filenames[i]); 
} 

Это своего рода фрагмент кода. Мне бы хотелось, чтобы он перескакивал через «00» и все еще признал его «почти» одним и тем же номером и все еще выводит его.

Я предположил бы, что это будет выглядеть как String em2 = "524"+ ## +"646" но то, очевидно, просто концепция

Кто-нибудь знает, есть ли способ иметь такого рода «символ» (термин я взял из универа SQL), или если есть другой способ сделать эту сделку типа сходства.

Спасибо :)

ответ

11

вы можете использовать регулярные выражения:

if (em1.matches("524[0-9]{2}646")) { 
    // do stuff 
} 
+0

это можно сделать и с буквами, как в шестнадцатеричных символах A-F? – user585522

+0

Да, [регулярные выражения] (http://en.wikipedia.org/wiki/Regular_expression) могут сделать это и ** много ** больше (см. Http://www.regular-expressions.info/ для некоторых действительно хорошая информация о регулярном выражении). –

+0

и, по-видимому, мне нужно загрузить это регулярное выражение? Или он поставляется со стандартным набором инструментов для разработки java? – user585522

6

Вы можете решить это легко с помощью регулярных выражений:

if (em1.matches("524..646")) 

, например.

(The . является подстановочным, что означает any character. Вы можете заменить его \\d, если вы хотите ограничить подстановочный до цифр.)

Вот более общий вариант, который соответствует «0» против любого характера :

String em1 = "52494646"; 
String em2 = "52400646"; 

if (em1.matches(em2.replaceAll("0", "\\\\d"))){ 
    System.out.println("Matches"); 
} 
+1

Ваш рейтинг напоминает мне о моем старом компьютере ... –

+0

+1 и напоминает мне ток один, не старый :) – fmucar

+0

@ кольцо0, спасибо. Это напоминает мне, что пришло время вернуться к работе;) – aioobe

1

Обычно вы можете сделать сочетание звезды tsWith, endsWith или содержит, чтобы найти начало строки, заканчивается или содержит другую строку. Вы можете использует их в комбинации, как

number.startsWith("524") && number.endsWith("646"); 

Используя регулярное выражение, вероятно, будет лучшим выбором 95% времени, но является более дорогим.

1

Регулярные выражения будут такими, как вы хотите это сделать. Для вашего примера вам нужно что-то вроде "524\\d{2}646". См. Java API for Regex.

Смотрите также полезную библиотеку Apache Commons IO здесь, так как это звучит, как вы имеете дело с файлами: https://commons.apache.org/proper/commons-io/javadocs/api-release/index.html?org/apache/commons/io/package-summary.html

0

Ну, к сожалению, я считаю, что apache commons StringUtil не имеет подстановочной операции.

Если я правильно помню, есть класс StringUtils в соединителе JDBC mysql, который имеет метод сравнения строк с подстановочными знаками.

-Или -

Вы можете попробовать использовать некоторый фуз логик: http://jfuzzylogic.sourceforge.net/html/index.html

1

Я думаю, что проблема с вышеупомянутым раствором RE является то, что вы не заинтересованы в цифрах, которые являются идентичными, но для 3-го или 4-й позиции, но в числах, которые идентичны, но для одной/двух цифр.

Это немного сложнее, но вы в основном хотите вычислить http://en.wikipedia.org/wiki/Hamming_distance для двух строк. Хорошо известный алгоритм для множества проблем, поэтому вы должны найти множество примеров, но я боюсь, что стандартная библиотека не сделает этого. Также это цикл for и счетчик, поэтому у вас не должно быть проблем с реализацией - вы теряете некоторый потенциал оптимизации, который может использовать STL (сравнивая адреса двух строк, и вам нужно сравнить всю строку в любом случае), но не намного больше.

0

Почему люди не хотят просто написать простой алгоритм &?

boolean equals(String s1, String s2, char wildcard) 

    if(s1.length() != s2.length()) 
     return false; 

    for(int i=0; i<s1.length(); i++) 
     char c1 = s1.charAt(i), c2 = s2.charAt(i); 
     if(c1!=wildcard && c2!=wildcard && c1!=c2) 
      return false; 

    return true; 
+1

возможно потому, что создание общих вещей - лучший способ написать код. используя регулярные выражения, у нас есть большая возможность записи, но мы генерируем (мало) отсутствие возможности чтения. Но все же нам, возможно, придется создать более одного выражения для обработки разных случаев. использование нечеткой логики является довольно общим и может обрабатывать все случаи. использование прямого алгоритма будет обрабатывать только одну конкретную конкретную ситуацию. – bluefoot

0

Если вы ищете другой способ выразить уайлдкард, вот вариант:

String em1 = "52494646"; 
    String em2 = "52400646"; 

    if (em2.startsWith("524")){ 
     output.writeUTF(dir + filenames[i]); 
    } 
Смежные вопросы