我正在尝试编写正则表达式以仅获取整数,例如 23、234、45 等,而不选择带小数点的数字。
对于上下文:
我需要在我正在编写的更大的正则表达式中使用它来转换混合分数 latex 输入 例如:
5\frac{7}{8}
但它不应该选择 latex 如:
3.5\frac{7}{8}
我目前的正则表达式是:
(^(.*)(?!(\.))(.*))\\frac{([^{}]+(?:{(?:[^{}]+)}|))}{([^{}]+(?:{(?:[^{}]+)}|))}
但它同样适用于整数和小数。需要更改 group1 的正则表达式。
最佳答案
也许这会为你做:
(?<!\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"
其余的和你原来的表达一样。
编辑
因为显然有人在那里,无论多么令人难以置信,仍然没有转移到真正的浏览器;)-答案必须更改为:
做不做要看latex的语法
(因为我不知道,所以我一开始就不应该说任何话;)
问题是,不回头看,如果不匹配您感兴趣的表达式之外的字符,您就无法做到这一点。在您的 regexr-example 中,您清楚地表明您不仅希望能够在开头匹配表达式的弦,也是在中间的。因此,我们需要能够分辨出匹配项之前的部分不是十进制数的整数部分。现在,通过匹配来做到这一点不是问题。例如
(?:^|[^\d.])(\d+)\\frac{...
就像 Wiktor 在评论中建议的那样,如果表达式位于行的开头 (^
),或 前面是非小数的内容,则会匹配点或数字 ([^\d.]
)。应该这样做。 ( Here at regex101 .)
嗯,正如前面指出的,这取决于 latex 的语法。如果两个表达式可以直接相邻,它们之间没有任何运算符或 stuff,则您不能(据我所知)使用 JS 正则表达式来做到这一点。考虑 1\fraq{0}{1}2\fraq{2}{3}
(我不知道它在语法上是否正确)。第一个表达式 1\fraq{0}{1}
是小菜一碟。但是在匹配之后,我们需要在第二个表达式之前匹配一个字符以验证它不是以十进制数字开头,但是由于第一个表达式已经吃掉字符,我们不能。因为验证我们的表达式不是以十进制数开头的 (?:^|[^\d.])
测试将匹配实际属于我们的表达式的字符之一( 2
in 2\fraq{2}{3}
), 从而使匹配失败,因为剩余部分不是以满足其余部分所需的数字开头正则表达式 (\d+)\\frac{...
。
但是,如果一个表达式总是开始测试的字符串,或者前面有 and 运算符等,那么应该可以使用
(?:^|[^\d.])(\d+)\\frac{([^{}]+(?:{(?:[^{}]+)})?)}{([^{}]+(?:{(?:[^{}]+)})?)}
(抱歉我乱说了)
关于javascript - 在javascript中使用正则表达式获取整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50908494/