Как пролить предложение, используя слова в StringTokenizer (JAVA) - PullRequest
1 голос
/ 21 марта 2020

У меня есть предложение, в котором имена авторов разделены словом «и». Я хочу удалить "и" и поставить вместо этого &. Есть ли быстрый и простой способ сделать это. Я попытался сканер и использовать Delimiter (), StringTokenizer и разделить.

Это, например, то, что я хочу разделить (я получаю эту информацию из файла на моем компьютере):

author={J. Park and J. N. James and Q. Li and Y. Xu and W. Huang}, 

Поэтому я использовал:

String author = nextLine.substring(nextLine.indexOf("{") + 1, nextLine.lastIndexOf("}"));

StringTokenizer st2 = new StringTokenizer(author, " and ");

while(st2.hasMoreTokens()){
      author += st2.nextToken() + " & ";
}

Вывод, который я получаю, следующий:

J. Park and J. N. James and Q. Li and Y. Xu and W. HuangJ. & P & rk & J. & N. & J & mes & Q. & Li & Y. & Xu & W. & Hu & g & .

Я не совсем уверен, что я делаю неправильно. Я гуглил это 2 часа вчера вечером, прежде чем сдаться. Я пытался использовать «[и]», «и», «^ [и] $», но безуспешно.

Ответы [ 3 ]

1 голос
/ 21 марта 2020

Просто для полноты, другой способ сделать это с помощью replaceAll()

String author="{J. Park and J. N. James and Q. Li and Y. Xu and W. Huang}";
author = author.replaceAll( " and ", " & " );

. Вы получите тот же результат. Обратите внимание на пробелы вокруг " and ". Это мешает вам заменить слово, подобное «Rosaland», на «Rosal &». Пробелы вокруг " & " должны быть такими же, как и раньше. Без них вы получите "J. Park&J. N. James".

Просто к вашему сведению: "\b" - инструмент для программистов. Используемая им «граница слова» включает в себя типичные «слова программиста». Быстрая проверка говорит, что она соответствует чему-либо, что не является [A-Za-z0-9_], поэтому, если у вас есть имя, такое как «Johhan Fu-and-leson», оно будет соответствовать «-» и заменить его. Очень маловероятно, но что-то нужно иметь в виду.

Кроме того, такая строка, как "Lindy Harlaown_and Fate", _ не будет соответствовать, и замена не произойдет. Снова кое-что, что нужно иметь в виду.

Регулярное выражение не волшебник c и не читает ваши мысли, и его соответствие по умолчанию может не соответствовать вашим конкретным потребностям.

1 голос
/ 21 марта 2020

Используйте метод replaceAll. Например:

String s = "J. Park and J. N. James and Q. Li and Y. Xu and W. Huang";
s = s.replaceAll("\\band\\b", "&"); // "J. Park & J. N. James & Q. Li & Y. Xu & W. Huang"

Границы слова \b гарантируют, что если имя содержит and (например, "Band"), оно не будет затронуто.

1 голос
/ 21 марта 2020

Если вы просто хотите заменить "и" на "&", вы можете просто вызвать метод relaceAll() в строке.

Попробуйте это.

public class Test{

    public static void main(String []args){
        String author= "J. Park and J. N. James and Q. Li and Y. Xu and W. Huang"; 
        System.out.println(author);
        author = author.replaceAll("\\band\\b", "&");
        System.out.println(author);
    }
}
...