当前位置: 首页 > 知识库问答 >
问题:

未知字符上的java正则表达式匹配器异常

皇甫浩壤
2023-03-14

所以我有一个字符串,我想将其拆分为不同类型的标记,作为更大解析器的一部分。

String input = "45 + 31.05 * 110 @ 54";

我使用javas正则表达式库Pattern和Matcher来解释我的正则表达式并查找匹配项。

String floatRegex = "[0-9]+(\\.([0-9])+)?";
String additionRegex = "[+]";
String multiplicationRegex = "[*]";
String integerRegex = "[0-9]+"

我所有的正则表达式被合并到一个主正则表达式中,在不同的正则表达式之间带有管道符号。

String masterOfRegexes = "[0-9]+(\\.([0-9])+)?|[+]|[*]|[0-9]+"

我把这个图案做成图案。compile()并获取匹配器。当我从左向右迈步时,跑着matcher。find(),我希望得到这个结构,直到“@”符号,在这里应该抛出InvalidInputException。

[
  ["Integer": "45"],
  ["addition": "+"],
  ["Float": "31.05"],
  ["multiplication": "*"],
  ["Integer": "110"]
  Exception should be thrown...
]

问题是那个匹配器。find()完全跳过“@”符号,而是查找“@”之后的下一个整数的匹配项,即“54”。

为什么它会跳过“@”符号?我如何才能使它在从我的模式中无法识别的字符上引发异常?

共有2个答案

吴炎彬
2023-03-14

Matcher知道:

  • 匹配:匹配全部、整个输入

使用“查找”跳过了“@”。使用罕见的查找按钮,或检查查找开始/结束位置。

公孙新觉
2023-03-14

正则表达式匹配或不匹配。在您的示例数据中,它没有跳过@,只是与它不匹配。

您可以做的是识别单个捕获组中的有效匹配,并在循环匹配时检查组1是否不为null。

如果不是,则模式具有有效的组1匹配,否则可以引发异常。

请参阅regex演示和Java演示。

String regex = "([0-9]+(?:\\.[0-9]+)?|[+]|[*]|[0-9]+)|\\S+";
String string = "45 + 31.05 * 110 @ 54";

Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    if (matcher.group(1) == null) {
        // your Exception here
        // throw new Exception("No match!");
        System.out.println(matcher.group() + " -> no match");
    } else {
        System.out.println(matcher.group(1) + " -> match");
    }
}

输出

45 -> match
+ -> match
31.05 -> match
* -> match
110 -> match
@ -> no match
54 -> match
 类似资料:
  • 问题内容: 什么正则表达式将匹配Java中的任何ASCII字符? 我已经尝试过: 但是发现它与我想要的很多东西都不匹配(例如空格,括号等)。我希望避免以如下格式显式列出所有127个ASCII字符: 问题答案: 我没用过但是我用过

  • 问题内容: 当字符串以数字开头时,我需要匹配,然后是一个点,然后是一个空格和1个或多个大写字符。匹配必须发生在字符串的开头。我有以下字符串。 我尝试过的正则表达式是: 它不匹配。一个有效的正则表达式将对这个问题有什么作用? 问题答案: (对不起,我先前的错误。大脑现在坚定地投入了。嗯,也许。) 这有效: 分解: =字符串开头 =一个或多个数字 (之所以转义,是因为它在字符串中,因此) =文字(或者

  • 问题内容: 我从以下格式的文件中获取输入: 现在,我想在我的Java代码中读取int1,int2,int3和int4。我该如何在Java中使用正则表达式匹配。谢谢。 问题答案: 为了避免空值:

  • 问题内容: 我在尝试将我的javascript regex经验转移到Python时遇到了麻烦。 我只是想让它工作: …但是它打印无。如果我做: 它匹配…默认情况下是否匹配字符串的开头?当匹配时,如何使用结果? 我如何进行第一场比赛?是否有比python网站提供的文档更好的文档? 问题答案: 隐式添加到您的正则表达式的开头。换句话说,它仅在字符串的开头匹配。 将在所有位置重试。 一般来说,建议您在需

  • 问题内容: 我在用Python将字符串中的数字匹配时遇到麻烦。尽管应该明确匹配,但甚至不匹配 或仅匹配。我的监督在哪里? 问题答案: 阅读文档:http : //docs.python.org/2/library/re.html#re.match 如果在零个或多个字符 开头 的 字符串 您要使用(或)

  • 我有一根绳子。假设:< br> 我想将所有替换为单词和替换为。一般来说,我想替换单个字母或单个字母与空格或点之间的所有点。我认为匹配的正则表达式是: 我怎么能只替换那个点,而不是所有匹配的东西? 编辑: 预期产出: 编辑2: 基本任务是从缩写和首字母缩略词中删除点,这些缩略词可以用点或不用点编写。所以一个好的正则表达式也很有价值