Найти индекс не-цифры с помощью регулярных выражений в Java - PullRequest
0 голосов
/ 19 марта 2019

Это, вероятно, простой вопрос, но я не смог понять это.Я хочу найти следующую букву (от А до Я) в строке после определенной точки в строке.Результат, который я хочу получить снизу, для строки money будет "$ 5,00", но num2 всегда будет иметь значение -1. ​​

String text = "hello$5. 00Bla bla words that don't matter"

int num1 = text.indexOf('$');
int num2 = text.indexOf("[a-zA-Z]" , num1 + 1); // Always results in -1

String money = text.substring(num1, num2);

Ответы [ 3 ]

1 голос
/ 19 марта 2019

Чтобы найти первую букву после знака $ доллара, используя регулярное выражение, вы можете использовать следующее регулярное выражение:

\$\P{L}*\p{L}

Пояснение:

\$       Match a $ dollar sign
\P{L}*   Match 0 or more characters that are not Unicode letters
\p{L}    Match a Unicode letter

Индекс буквы является последним символом совпадающей подстроки, то есть одним символом перед end() совпадения.

Пример

String text = "hello$5. 00Bla bla words that don't matter";

Matcher m = Pattern.compile("\\$\\P{L}*\\p{L}").matcher(text);
if (m.find()) {
    int idx = m.end() - 1;
    System.out.println("Letter found at index " + idx + ": '" + text.substring(idx) + "'");
}

выход

Letter found at index 11: 'Bla bla words that don't matter'

UPDATE

Кажется, что фактический вопрос несколько отличался от ответа выше, поэтому для захвата текста от $ знака доллара (включительно) и всех последующих символов до первой буквы (исключая) или конца строки используйте это регулярное выражение:

\$\P{L}*

* +1032 * Пример * +1034 *

String text = "hello$5. 00Bla bla words that don't matter";

Matcher m = Pattern.compile("\\$\\P{L}*").matcher(text);
if (m.find()) {
    String money = m.group();
    System.out.println("money = \"" + money + "\"");
}

выход

money = "$5. 00"
0 голосов
/ 19 марта 2019

Спасибо за помощь всем. Я нашел способ сделать это без использования регулярных выражений.

String money = "";
while (!Character.isLetter(text.charAt(num1))) {
  money = money + text.charAt(num1);
  num1++;
}

Возможно, позже понадобится немного работы, но, похоже, это сработает.

0 голосов
/ 19 марта 2019

Это не проверено, так как моя рабочая станция не настроена для Java 9, но, используя этот выпуск, вы сможете сделать это:

String result = text.substring(text.indexOf('$'), text.length())
    .takeWhile(ch -> !Character.isAlphabetic(ch))
    .map(Object::toString).collect(Collectors.joining());

result оценивается как $5. 00

Примечание: Stream<T>#takeWhile - это функция Java 9

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