也许这对你有用:
(?<!\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"
其余的和你原来的表达一样。
See it here at regex101.
编辑
因为显然有些人仍然没有转移到真正的浏览器上,无论多么令人难以置信;) - 答案必须改为:
这取决于latex的语法,你能不能做到。
(因为我不知道,所以我一开始就不应该说什么;)
问题是,如果没有后视,你就不能在不匹配你感兴趣的表达式之外的字符的情况下做到这一点。在你的正则表达式示例中,你清楚地表明你希望能够匹配表达式不仅在开头一串串,也是在中间的。因此,我们需要能够分辨出我们匹配之前的部分不是十进制数的整数部分。现在,通过匹配来做到这一点不是问题。例如
(?:^|[^\d.])(\d+)\\frac{...
就像 Wiktor 在 cmets 中建议的那样,如果表达式在行首 (^) 将匹配,或前面有一些不是小数点或数字的内容 ( [^\d.])。那应该这样做。 (Here at regex101.)
嗯,正如前面所指出的,这取决于乳胶的语法。如果两个表达式可以直接相邻,它们之间没有任何运算符或 stuff,那么(据我所知)你不能用 JS 正则表达式来做。考虑1\fraq{0}{1}2\fraq{2}{3}(我不知道它在语法上是否正确)。第一个表达式1\fraq{0}{1} 是小菜一碟。但是在匹配之后,我们需要在第二个表达式之前匹配一个字符以验证它不是以十进制数字开头,但是由于第一个表达式已经 ate 字符,我们不能。因为测试(?:^|[^\d.]) 验证我们的表达式不是以十进制数字开头,将匹配实际属于我们表达式的字符之一(2\fraq{2}{3} 中的2),从而使匹配失败,因为其余部分不是以满足正则表达式 (\d+)\\frac{... 其余部分所需的数字开头。
但是,如果一个表达式总是以测试字符串开头,或者前面有 and 运算符等,那么它应该可以使用
(?:^|[^\d.])(\d+)\\frac{([^{}]+(?:{(?:[^{}]+)})?)}{([^{}]+(?:{(?:[^{}]+)})?)}
Here at regex101.
(对不起,我的胡言乱语)