因此,我正在上学的分数班,正在使用正则表达式模式和匹配器进行用户输入。我在网上找到了这个,所以我不会完全确定我要做什么,但是以下模式可以找到每个数字,中间运算符,并允许用户输入的所有字符(分数表达式)之间使用空格和制表符。
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元字符和符号含义,但我有点挣扎。有人可以给我解释每个角色吗?或者可能是完成同一件事的更简单方法。
所以您要匹配分数?像"2 / 3"
之类的东西,并允许空格吗?如果是这样,则要匹配(并捕获)某个数字字符串,然后匹配'/'
字符,然后匹配并捕获另一个数字字符串。不考虑空格,这只是:
"(\\d+)/(\\d+)"
regex中的\d
匹配任何数字(0-9),但是由于我们用字符串指定了regex,因此我们必须转义反斜杠本身。也就是说,Java字符串文字“ \”将导致一个带有一个反斜杠字符的String对象。+
表示“一个或多个”,并用括号括起来。然后,斜杠只是一个文字斜杠。要使其具有空格,请匹配并丢弃任何空格。 \ s可以匹配任何类型的空格(空格,制表符,换行符),同样,我们必须转义反斜杠:
"(\\d+)\\s*/\\s*(\\d+)"
*
表示“零或更多”。所以从左到右,这意味着:
一个或多个数字,被捕获
零个或多个空格
斜线
零个或多个空格
一个或多个数字,被捕获
要处理两端的空格,请匹配空格或trim()首先是字符串。
您发布的正则表达式模式实际上与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是您的朋友。)