更简单的正则表达式格式吗?

问题描述 投票:0回答:2

因此,我正在上学的分数班,正在使用正则表达式模式和匹配器进行用户输入。我在网上找到了这个,所以我不会完全确定我要做什么,但是以下模式可以找到每个数字,中间运算符,并允许用户输入的所有字符(分数表达式)之间使用空格和制表符。

String fractionPattern = "\\s*\\t*\\\\*t*(-?\\d+)\\s*\\t*\\\\*t*\\/\\s*\\t*\\\\*t*(-?\\d+)\\s*\\t*\\\\*t*([-+*/])\\s*\\t*\\\\*t(\\d+)\\s*\\t*\\\\*t*\\/\\s*\\t*\\\\*t*(-?\\d+)\\s*\\t*\\\\*t*";

我曾尝试研究Java regex元字符和符号含义,但我有点挣扎。有人可以给我解释每个角色吗?或者可能是完成同一件事的更简单方法。

simple-form-for
2个回答
1
投票

所以您要匹配分数?像"2 / 3"之类的东西,并允许空格吗?如果是这样,则要匹配(并捕获)某个数字字符串,然后匹配'/'字符,然后匹配并捕获另一个数字字符串。不考虑空格,这只是:

"(\\d+)/(\\d+)"
regex中的

\d匹配任何数字(0-9),但是由于我们用字符串指定了regex,因此我们必须转义反斜杠本身。也就是说,Java字符串文字“ \”将导致一个带有一个反斜杠字符的String对象。+表示“一个或多个”,并用括号括起来。然后,斜杠只是一个文字斜杠。要使其具有空格,请匹配并丢弃任何空格。 \ s可以匹配任何类型的空格(空格,制表符,换行符),同样,我们必须转义反斜杠:

"(\\d+)\\s*/\\s*(\\d+)"

*表示“零或更多”。所以从左到右,这意味着:

  1. 一个或多个数字,被捕获

    零个或多个空格

    斜线

    零个或多个空格

    一个或多个数字,被捕获

    要处理两端的空格,请匹配空格或trim()首先是字符串。


1
投票

您发布的正则表达式模式实际上与two分数之间的任何操作都匹配。

其中有很多杂音,并带有额外的\t(制表符)字符(对于空格,\s则多余)。删除那些,并将双反斜杠更改为单反斜杠以提高可读性,我们得到以下信息:

\s*(-?\d+)\s*\/\s*(-?\d+)\s*([-+*/])\s*(\d+)\s*\/\s*(-?\d+)\s*

((当正则表达式在字符串中时需要双反斜杠,因此不将其视为escape sequence

让我们分解一下:

  • [\s*表示匹配0个或更多空白字符
  • [-?表示匹配一个-字符或不匹配,对于负数
  • [\d+表示匹配1个或多个数字(0-9)
  • (-?\d+)周围的括号表示我们可以捕获第一个数字,并在以后需要时引用它。
  • [\s*再次表示0个或更多空白字符
  • \/表示字面上匹配/。某些语言/正则表达式解析器要求在反斜杠前加反斜杠,而其他语言(如Python)则不需要。
  • \s*(-?\d+)\s*是我们刚刚做的相同的事情:再次捕获另一个(可能是负数),可能被空格包围,并用括号将其捕获以备后用。
  • ([-+/])表示匹配-+/中的任何一个:我们要在两个分数之间执行的操作。括号是可选的,只有在以后要获取此字符时才需要。
  • \s*(\d+)\s*\/\s*(-?\d+)\s*再次是我们对第一个分数的处理,只是由于某种原因分子中未包含可能的负号,这可能是一个错误。
  • 您可以在here中对其进行测试。 (Regex101是您的朋友。)

© www.soinside.com 2019 - 2024. All rights reserved.