Каков наилучший способ найти конкретные токены в строке (на Java)? - PullRequest
1 голос
/ 06 января 2009

У меня есть строка с разметкой, которую мне нужно найти с помощью Java.

например.

string = abc<B>def</B>ghi<B>j</B>kl

desired output..

segment [n] = start, end

segment [1] = 4, 6
segment [2] = 10, 10

Ответы [ 6 ]

8 голосов
/ 06 января 2009

Регулярные выражения должны прекрасно работать для этого.

Обратитесь к вашему JavaDoc для

  • java.langString.split ()
  • пакет java.util.regex
  • java.util.Scanner

Примечание. StringTokenizer - это не то, что вам нужно, поскольку он разбивается на символов , а не на строки - разделитель строк представляет собой список символов, любой из которых будет разделен. Это хорошо для очень простых случаев, таких как однозначный список через запятую.

2 голосов
/ 06 января 2009

Учитывая ваш пример, я думаю, что я бы использовал регулярные выражения и, в частности, я бы посмотрел на функциональность группировки, предлагаемую Matcher.

Tom

String inputString = "abc<B>def</B>ghi<B>j</B>kl";

String stringPattern = "(<B>)([a-zA-Z]+)(<\\/B>)";

Pattern pattern = Pattern.compile(stringPattern);
Matcher matcher = pattern.matcher(inputString);

if (matcher.matches()) {

    String firstGroup  = matcher.group(1);
    String secondGroup = matcher.group(2); 
    String thirdGroup  = matcher.group(3);
}
2 голосов
/ 06 января 2009

StringTokenizer выдаст вам отдельные токены, если вы хотите разделить строку по определенной строке. Или вы можете использовать метод split () в String, чтобы получить отдельные строки. Чтобы получить разные массивы, вы должны поместить регулярное выражение в.

1 голос
/ 06 января 2009

Это немного "грубая сила" и делает некоторые предположения, но это работает.

public class SegmentFinder
{

    public static void main(String[] args)
    {
        String string = "abc<B>def</B>ghi<B>j</B>kl";
        String startRegExp = "<B>";
        String endRegExp = "</B>";
        int segmentCounter = 0;
        int currentPos = 0;
        String[] array = string.split(startRegExp);
        for (int i = 0; i < array.length; i++)
        {           
            if (i > 0) // Ignore the first one
            {
                segmentCounter++;
                //this assumes that every start will have exactly one end
                String[] array2 = array[i].split(endRegExp);
                int elementLenght = array2[0].length();
                System.out.println("segment["+segmentCounter +"] = "+ (currentPos+1) +","+ (currentPos+elementLenght) );
                for(String s : array2)
                {
                    currentPos += s.length();  
                }
            }
            else
            {
                currentPos += array[i].length();                
            }
        }
    }
}
1 голос
/ 06 января 2009

StringTokenizer принимает всю строку в качестве аргумента и не очень хорошая идея для больших строк. Вы также можете использовать StreamTokenizer

Вам также нужно взглянуть на Сканер .

0 голосов
/ 06 января 2009

Ваш ввод похож на ваш пример, и вам нужно получить текст между определенными тегами? Затем простой StringUtils.substringsBetween (yourString, "", "") с использованием пакета apache commons lang (http://commons.apache.org/lang/) должен выполнить эту работу.

Если вы ищете более общее решение для различных и, возможно, вложенных тегов, вы можете посмотреть на анализатор, который принимает ввод html и создает из него документ XML, такой как NekoHTML, TagSoup, jTidy. Затем вы можете использовать XPath в документе XML для доступа к содержимому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...