Обработка строк со специальными символами в Java - PullRequest
0 голосов
/ 18 февраля 2019

Я реализую алгоритм сопоставления строк, который требует обработки строк специальными символами.С одной стороны соответствия, строки были подготовлены в Python, а затем прошли через JAVA.С другой стороны, они были подготовлены другой средой.Теперь я сопоставляю их в моей программе на Java (строки, полученные из входных данных JSON).

Хотя некоторые символы обрабатываются, у меня возникают проблемы с обработкой многих других.

Например, для этого я получаю MATCH (оба отображаются на моей консоли как >> AS IT COMES CRUMBLING):

"text":"\u003e\u003e AS IT COMES CRUMBLING"
"caption":">> AS IT COMES CRUMBLING"

Но эти отображаются как NON-MATCH :

"text":"What if you had fewer headaches\nand migraines a month?"
"text":"What if you had fewer headaches\\nand migraines a month?"

Или это:

"text":"Effects of BOTOX® may spread"
"text":"Effects of BOTOX\\xc2\\xae may spread"

Или это:

"text":"Let's also rethink how\nwe care for ourselves."
"text":"Let'\\xe2\\x80\\x99s also rethink how\\nwe care for ourselves."

В моем коде я использую JSONPathчтобы прочитать JSON входные данные с обеих сторон, поместите их в ArrayList, а затем сравните один со всеми элементами в списке.

boolean found=false;
myText foundText = null;
for (int i = 0; i < scheduledText.size(); i++) {
    if(current.text.equals(scheduledText.get(i).text)) {
        found = true;
        foundText =scheduledText.get(i);
        break;
    }
}
if(found)
   //print MATCH
else
   //print NON_MATCH

Я разочарован.Что я должен делать?Как я могу справиться с этим?

1 Ответ

0 голосов
/ 18 февраля 2019

Итак, для моего предложенного решения вы должны использовать функцию в своем Java-коде, как показано ниже.

private static String cleanTextContent(String text)
    {
        // strips off all non-ASCII characters
        text = text.replaceAll("[^\\x00-\\x7F]", "");

        // erases all the ASCII control characters
        text = text.replaceAll("[\\p{Cntrl}&&[^\r\n\t]]", "");

        // removes non-printable characters from Unicode
        text = text.replaceAll("\\p{C}", "");

        text = text.replaceAll("[^ -~]","");

        text = text.replaceAll("[^\\p{ASCII}]", "");

        text = text.replaceAll("\\\\x\\p{XDigit}{2}", "");

        text = text.replaceAll("\\n","");

        text = text.replaceAll("[^\\x20-\\x7e]", "");
        return text.trim();
    }

После вызова этой функции вы можете использовать Apache Commons lib для преобразования строки в хэш md5 примерно так:.

private static String hashMyString(String text)  {

    String hashText= text;

    String md5Hex = DigestUtils
      .md5Hex(hashText).toUpperCase();

   return md5Hex;
}

Наконец, просто сравните два хэша в вашей основной программе.

Редактировать: Если используется maven, то это библиотека, которая в основном заставляет DigestUtils работать.

   <!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.9</version>
</dependency>

Редактировать: Мой полный тестовый код для строки.

public class App 
{
    public static void main( String[] args ) throws UnsupportedEncodingException
    {

       String sideOneString = "Effects of BOTOX® may spread";
       String sideTwoString = "Effects of BOTOX\\xc2\\xae may spread";
       String sideThreeString = "BOTOX injections take about\n15 mins";
       String sideFourString  = "BOTOX\\xc2\\xae injections take about\\n15 mins";


       System.out.println( hashMyString(cleanTextContent(sideOneString)));
       System.out.println( hashMyString(cleanTextContent(sideTwoString)));
       System.out.println( hashMyString(cleanTextContent(sideThreeString)));
       System.out.println( hashMyString(cleanTextContent(sideFourString)));
    }





    private  static  String hashMyString(String text)  {

        String hashText= text;

        String md5Hex = DigestUtils.md5Hex(hashText).toUpperCase();
        //System.out.println(md5Hex);
       return md5Hex;
    }

    private static String cleanTextContent(String text)
    {
        // strips off all non-ASCII characters
        text = text.replaceAll("[^\\x00-\\x7F]", "");

        // erases all the ASCII control characters
        text = text.replaceAll("[\\p{Cntrl}&&[^\r\n\t]]", "");

        // removes non-printable characters from Unicode
        text = text.replaceAll("\\p{C}", "");

        text = text.replaceAll("[^ -~]","");

        text = text.replaceAll("[^\\p{ASCII}]", "");

        text = text.replaceAll("\\\\x\\p{XDigit}{2}", "");
        text = text.replaceAll("\\\\n","");


        text = text.replaceAll("[^\\x20-\\x7e]", "");
        return text.trim();
    }
}

Результат:

F928A529F380EB59575AC8A175FDFE79
F928A529F380EB59575AC8A175FDFE79
B4740299C53E18C9ECAF18BA35151D43
B4740299C53E18C9ECAF18BA35151D43
...