Java: Как использовать расширенную строку replaceAll Regex с / без Lookahead / Lookbehind - PullRequest
0 голосов
/ 09 декабря 2018

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

Т.е. "0", "-hi", "hi-"и "привет" все будут отклонены.

Однако "яблоко", "Бен", "Бен" и "уважаемый" будут приняты.

Я пытаюсь выяснить это с помощью функции String replaceAll в Java.Я хотел бы знать, как сделать это с помощью «простого» регулярного выражения, а также как использовать более продвинутый lookbehind / lookahead для достижения этого.

Пока что в отношении RegEx это то, чтоЯ попытался:

String tempString;
tempString = tempString.replaceAll("^([a-zA-Z]+(-)?[a-zA-Z]+)"," ");
tempString = tempString.replaceAll("^([a-zA-Z]+(')?[a-zA-Z]*)"," ");
//Basically if it does not meet this condition, replace w/ whitespace

На данный момент синтаксис регулярных выражений даже не является правильным.Проверка любого из этих двух на соответствие «непринятым» словам выше не заменит их на «».Вдобавок ко всему, мне нужно объединить эти два RegEx в одно, чтобы обеспечить надлежащую общую функциональность.

На аналогичной ноте, и, как я понимаю, я могу использовать прогнозирование / просмотр назад для достижения желаемого результата.Тем не менее, после прочтения этого процесса, я запутался в синтаксисе, который будет вставлен в функцию replaceAll.

Итак, мои два вопроса следующие:

  1. ЧтоМогу ли я изменить синтаксис RegEx, чтобы проверять дефисы и апострофы в одном вызове функции replaceAll?
  2. Как можно использовать прогнозирование / просмотр назад для достижения той же цели?

ПожалуйстаОбратите внимание, что я НЕ ищу другие решения, так как я пытаюсь лучше понять RegEx.Также это мой первый вопрос, поэтому прошу прощения за любые проблемы с форматированием или другие глупые вещи.

Спасибо!

1 Ответ

0 голосов
/ 09 декабря 2018

Это регулярное выражение должно работать.Но мы должны разбить входные файлы на слова, а затем выполнить регулярное выражение.потому что String.replaceAll поиск последовательности продолжается.Например, '-apple', replaceAll всегда пропускает '-', затем соответствует 'apple'.

legal chars + ( ( - or ') andlegal chars )``+ ( ( - or ') and legal chars ) + ...

@Test
public void test() {
    Pattern pattern = Pattern.compile("([\\w]*[a-zA-Z][\\w]*)([-'][\\w]*[a-zA-Z][\\w]*)*");

    Matcher m = pattern.matcher("0");
    Assert.assertFalse( m.matches());
    m = pattern.matcher("apple");
    Assert.assertTrue( m.matches());
    m = pattern.matcher("apple-");
    Assert.assertFalse( m.matches());
    m = pattern.matcher("-apple");
    Assert.assertFalse( m.matches());
    m = pattern.matcher("apple-a0");
    Assert.assertTrue( m.matches());
    m = pattern.matcher("Tom-Jerry's");
    Assert.assertTrue( m.matches());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...