我将尝试清楚地表达这一点...(我在Regex中很新)。我正在使用一个名为Autobookmark(来自Evermap)的程序来制作PDF文档。我正在尝试将其设置为链接编号引用到参考书目中的编号参考。
目标是匹配括号内的每个编号引用,并仅在括号内返回该数字。换句话说,如果我有[85],我会返回[85]。如果我有[85,93],我会返回[85]和[93]。如果括号中有更多的数字,最多n个数字,我将返回n(括号中)。如果有一个范围,即[85-93],我只需要返回第一个即可。
所以在我看来,我在问这个:只有在开放式括号之前,数字(1至3位数字),或者其他数字之后是逗号和空间,但前提是该数字之前通过开放式支架或数字,然后是逗号和空间,但前提是...您得到图片。迭代直到击中括号(然后返回数字)或非数字,在这种情况下,请勿返回数字。这甚至合理地要求正则表达方式吗?或者,既然我在PDF中这样做,我是否必须执行JavaScript例程?(顺便说一句,我也不知道该怎么做!)谢谢!我知道我是新手,我感谢任何想法。
我没有这个程序的经验,但这应该与JavaScript一起使用,因此,REGEX的其他功能最少实现。
[?s*(d+)s*(?=(?:,s*d+)+|])(?=[^[]*]).
[? # Literal [, zero or 1 times
s* # Any number (*) of whitespace characters
(d+) # Any number of digits, one or more (+)
s* # Any number (*) of whitespace characters
(?= # Positive lookahead, support for possitive lookahead is key to the regex
(?: # Open non-capturing group
,s*d+ # Literal ",", any number of whitespace characters,
# digits one or more
) # Close non-capturing group
| # or
] # Literal "]"
) # Close positive lookahead
(?= # Open another positive lookahead
[^[]*] # Any number of characters that are not "[", as long as they're followed by "]".
# This is only a validation check, those characters won't be caught
) # Close positive lookahead
. # Match any character except newline
如果此程序支持可变长度的书本,您可以使用此程序,这仅添加了一个lookBehind来使数字也由有效字符进行前缀。
[?s*(?<=[[,d ]*)(d+)s*(?=(?:,s*d+)+|])(?=[^[]*]).
如果您的引文格式为100%可靠的[1]
,[12]
,[13, 14, 21]
等。您可以使用更简单的版本
[?s*(d+)(?=(?:, d+)|])(?=[^[]*]).
或此程序如果您的程序支持可变长度的lookbehinds, [(?<=[[,d ]*)(d+)(?=(?:, d+)|])(?=[^[]*]).
。
使用这些表达式中的任何一个:您可以更改最后一个字符, .
,将其更改为 ]?
,以查看仍被COMAS [1],[15],[22]
分开的引用。
*
在正则表达式的许多口味中,lookBehinds - 如果完全支持,则必须是一个固定长度,没有量化词,所有交替均具有相同的宽度。例如,(?<=a|1)
可以工作,但(?<=a|12)
,(<=a|1+)
或(<=a+)
将失败。正如将量化器应用于lookbehind本身(?<=a)+
编辑:感谢您的输入。
感谢您的建议!这就是发生的事情。显然,Evermap不了解可变长度的镜头,所以我尝试了您的其他。他们给出了一些结果,但不是全部。它们匹配括号中的简单数字,并且匹配括号内的系列中的最后一个数字。
Autobookmark确实提供了搜索文本模式的"多重规则"方式,因此我可以单独寻找[35]或[35或35]或35或35-单独的[35]或[35或35]。
现在,我正在使用三个规则:
([)(d{1,3})(]|,)
[?s*(d+)(?=(?:, d+)|])(?=[^[]*]).
([|s)(d{1,3})-
对于每个这些,"替换"或程序所谓的"链接操作"是提取的数字,或2
。
这使我大部分想要的东西,但是,如果一个系列中有两个以上的数字,则由逗号 空间隔开,则不符合中间数字。我想,如果找不到更好的方法,我会手工做。
我知道我在这里跌跌撞撞...感谢您的帮助,并感谢您对新手的耐心!(如果我解决这个问题,所以它是完全自动化的,我将成为工作的上帝...)