在Java中使用正则表达式查找非数字的索引

时间:2019-03-19 00:29:46

标签: java regex

这可能是一个简单的问题,但我一直无法弄清楚。我想在字符串中的某个点之后找到字符串中的下一个字母(A到Z)。我要从下面得到的结果是字符串钱为“ $ 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 个答案:

答案 0 :(得分:1)

要使用正则表达式查找$美元符号后面的第一个字母,可以使用以下正则表达式:

\$\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'

更新

似乎实际问题与上面的回答略有不同,因此要从$美元符号(含)和后面的所有字符(直到首个字母(不含)或字符串的末尾)捕获文本,请使用此正则表达式:

\$\P{L}*

示例

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"

答案 1 :(得分:0)

这未经测试,因为我的工作站未针对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的功能

答案 2 :(得分:-1)

感谢大家的帮助。我找到了一种无需使用正则表达式的方法。

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

稍后可能需要一些工作,但它似乎可以工作。