首页 > 解决方案 > 在javascript中使用正则表达式获取整数

问题描述

我正在尝试编写一个正则表达式来仅获取整数,例如 23、234、45 等,而不是选择带小数点的数字。

对于上下文:

我需要在一个更大的正则表达式中使用它来转换混合分数乳胶输入例如:

5\frac{7}{8}

但它不应该选择乳胶,例如:

3.5\frac{7}{8}

我到目前为止的正则表达式是:

(^(.*)(?!(\.))(.*))\\frac{([^{}]+(?:{(?:[^{}]+)}|))}{([^{}]+(?:{(?:[^{}]+)}|))}

但它适用于整数和十进制数。需要更改 group1 的正则表达式。

标签: javascriptregexintegerlatex

解决方案


也许这会为你做到:

(?<!\d\.)\b(\d+)\\frac{([^{}]+(?:{(?:[^{}]+)}|))}{([^{}]+(?:{(?:[^{}]+)}|))}

它在 之前捕获一个整数表达式\fraq,除非它前面有一个数字和一个句号。

(?<!\d\.) This ensures the number isn't preceded by a digit followed by a full stop, i.e.
          the integer part of a floating.
\b        Must be at the start of a number (to make sure we don't get a match with the end
          of a multi digit number).
(\d+)     Captures the integer number
\\frac    Matches the string "\fraq"

其余的和你原来的表达一样。

在 regex101 处查看

编辑

由于显然有人在那里,无论多么令人难以置信,仍然没有转移到真正的浏览器;) - 答案必须改为:

这取决于乳胶的语法,您是否可以这样做。
(因为我不知道,所以我一开始就不应该说什么;)

问题是,如果不向后看,如果不匹配您感兴趣的表达式之外的字符,您就无法做到这一点。在您的正则表达式示例中,您清楚地表明您希望能够不仅在字符串的开头匹配表达式,也是在中间的。因此,我们需要能够分辨出我们匹配之前的部分不是十进制数的整数部分。现在,通过匹配来做到这一点不是问题。例如

(?:^|[^\d.])(\d+)\\frac{...

就像 Wiktor 在评论中建议的那样,如果表达式位于行首 ( ^),或者前面不是小数点或数字 ( [^\d.]),则匹配。那应该这样做。(这里是 regex101。)

好吧,正如前面所指出的,这取决于乳胶的语法。如果两个表达式可以直接相邻,它们之间没有任何运算符或东西,那么(据我所知)你不能用 JS 正则表达式来做。考虑一下1\fraq{0}{1}2\fraq{2}{3}(我不知道它在语法上是否正确)。第一个表达式1\fraq{0}{1}是小菜一碟。但是在匹配之后,我们需要在第二个表达式之前匹配一个字符以验证它不是以十进制数字开头,但是由于第一个表达式已经吃掉了字符,所以我们不能。因为(?:^|[^\d.])验证我们的表达式不是以十进制数字开头的测试将匹配实际属于我们的表达式的字符之一(2in2\fraq{2}{3}),从而使匹配失败,因为其余部分不是以满足 regex 其余部分所需的数字开头(\d+)\\frac{...

但是,如果表达式总是以测试字符串开头,或者前面有 and 运算符等,那么应该可以使用

(?:^|[^\d.])(\d+)\\frac{([^{}]+(?:{(?:[^{}]+)})?)}{([^{}]+(?:{(?:[^{}]+)})?)}

在这里 regex101

(对不起我的胡言乱语)


推荐阅读