我将尝试清楚地说明这一点......(我在正则表达式上很新)。我正在编写一个PDF文档,其中包含一个名为AutoBookmark的程序(来自Evermap)。我正在尝试将其设置为将参考编号的引文链接到参考书目中的编号参考文献。
目标是匹配括号内的每个编号引文,并将该数字单独返回括号内。换句话说,如果我有[85],我只会回[85]。如果我有[85,93],我会同时返回[85]和[93]。如果括号中有更多数字,最多N个数字,我将返回N个(括号中)。如果有一个范围,即[85-93],我只需要返回第一个。
所以在我看来我问这个:数字(1到3位数),只有前面有一个开括号,或者另一个数字后面跟一个逗号和一个空格,但只有在这个数字出现之前通过一个开括号或一个数字后跟一个逗号和一个空格,但只有......你得到了图片。迭代直到你敲一个括号(然后返回数字)或一个非数字,在这种情况下,不要返回数字。 问一个正则表达式是否合理?或者,因为我在PDF中执行此操作,我必须执行Javascript例程吗? (顺便说一下,我也不知道怎么办!) 谢谢!我知道我是这里的新手,我很感激任何想法。
答案 0 :(得分:1)
我没有使用此程序的经验,但this应该使用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
如果这个程序支持可变长度的bookbehinds,你可以使用它,只添加一个lookbehind以确保数字也有效字符作为前缀。
\[?\s*(?<=\[[,\d ]*)(\d+)\s*(?=(?:,\s*\d+)+|\])(?=[^\[]*\]).
如果您的引文格式100%可靠[1]
,[12]
,[13, 14, 21]
等,您可以使用simpler version
\[?\s*(\d+)(?=(?:, \d+)|\])(?=[^\[]*\]).
或者如果你的程序支持可变长度的lookbehinds,\[(?<=\[[,\d ]*)(\d+)(?=(?:, \d+)|\])(?=[^\[]*\]).
。
使用任何这些表达式:您可以将 .
的最后一个字符更改为 \]?
请参阅以逗号[1],[15],[22]
分隔的引文。
*
在许多正则表达式中,lookbehinds - 如果支持,必须是固定长度,没有量词,所有的交替都是相同的宽度。例如,(?<=a|1)
可行,但(?<=a|12)
,(<=a|1+)
或(<=a+)
将失败。应用于lookbehind本身(?<=a)+
编辑:感谢Rawing的输入。
答案 1 :(得分:0)
感谢您的建议!这里发生了什么。显然,Evermap并不了解可变长度的外观,所以我尝试了其他的。他们给出了一些结果,但不是全部。它们匹配括号中的简单数字,它们与括号内的系列中的最后一个数字相匹配。
AutoBookmark确实提供了一个&#34;多个规则&#34;搜索文本模式的方法,所以我可以单独查找[35]或[35或35]或35或35-。
现在,我使用了三条规则:
(\[)(\d{1,3})(\]|,)
\[?\s*(\d+)(?=(?:, \d+)|\])(?=[^\[]*\]).
(\[|\s)(\d{1,3})\-
对于其中的每一项,&#39;替换&#39;或程序调用的链接操作&#39;是提取的数字,或\2
。
这让我得到了我想要的大部分内容,但是如果系列中有两个以上的数字,用逗号+空格分隔,则它与中间数字不匹配。我想,如果我找不到更好的方法,我会手工完成。
我知道我在这里磕磕绊绊......感谢您的帮助,感谢您对新手的耐心! (如果我这样做是为了让它完全自动化,我会在工作中成为上帝......)