2017-03-05 36 views
0

我将尝试清楚地说明这个...(我在正则表达式中很新颖)。我正在开发一个PDF文档,其中有一个名为AutoBookmark的程序(来自Evermap)。我试图将其设置为在参考书目中将编号引用链接到编号引用。正则表达式N(1到3位)数字在方括号中,用逗号+它们之间的空格

目标是在括号内匹配每个带引号的引文,并单独在括号内返回该数字。换句话说,如果我有[85],我只会返回[85]。如果我有[85,93],我会同时返回[85]和[93]。如果括号内有更多数字,最多N个数字,我会返回N个(括号内)。如果有一个范围,即[85-93],我只需要返回第一个。

所以在我看来,我要问一下:数字(1〜3位),仅如果前面任何一方向的开口支架或其他号码后跟一个逗号和空格,但前提是这个数字在前面加一个前面的数字或者后面跟着一个逗号和一个空格,但是只有当你得到这张照片的时候。迭代直到你敲一个括号(然后返回数字)或一个非数字,在这种情况下,不要返回数字。 这个问题甚至有理由要求正则表达式吗?或者,因为我在PDF中这样做,我必须做一个Javascript例程吗? (顺便说一句,我也不知道该怎么办!) 谢谢!我知道我是这个新手,我很感激任何想法。

+0

有两件事我不明白:1)为什么这个标记'javascript'?这个AutoBookmark程序能执行javascript吗? 2)“_return_括号内的数字”是什么意思?你只是想用'[1] [2]'或其他的东西(例如为每个正则表达式匹配运行一些代码)来替换所有'[1,2]'的出现? –

+0

我知道......我没有训练,我确信我说的是错的。但是,基本上,是的。这相当于“替换所有事件”。我提出的(不完全回答邮件)是((?<= \ [)|(?<=(\ d,)))(\ d {1,3})''。这太多了,因为文本中可能还有一些数字,我不想要。如果必须,我可以忍受这一点 - 我宁愿有一些额外的错误链接,而不是错过任何。 –

回答

1

我对这个程序没有经验,但this应该与javascript一起工作,因此正则表达式的其他功能最小的实现。

\[?\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,则可以使用这一点,这只是增加了一个反向预搜索到makesure数目由有效字符前缀为好。

\[?\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+)将失败。量词将应用于后视本身(?<=a)+

编辑:并感谢Rawing输入。

+1

不错的正则表达式,但是有一些细节可以改进:1)'(?:\ [\ s * | \ s *)'可能只是'\ [?\ s *'。 2)在第一个前瞻中,你连续两次匹配'\ s *':'\ s *(?= ... | \ s * \])'这可能很危险,可以简化为\ s * (= ...?| \])'。 3)如果将',\ s * \ d +'更改为'[, - ] \ s * \ d +',它也会匹配'[1-2]'形式的引用。 –

+0

@Rawing你对第1和第2项的判断是正确的,虽然'-'支持在许多引用正则表达式中是一个很好的特性,但我觉得它在这里不合适。谢谢,尤其是对于偶然发生的双重'\ s *' –

0

感谢您的建议!这是发生了什么。显然,Evermap不了解可变长度的lookarounds,所以我尝试了其他的。他们给出了一些结果,但不是全部。它们与括号中的简单数字相匹配,并且它们与括号内的一系列中的最后一个数字相匹配。

AutoBookmark确实提供了搜索文本模式的“多重规则”方式,所以我可以单独查找[35]或[35或35]或35或35。

现在,我使用了三个规则:

(\[)(\d{1,3})(\]|,)

\[?\s*(\d+)(?=(?:, \d+)|\])(?=[^\[]*\]).

(\[|\s)(\d{1,3})\-

对于这些,在 '替换',或什么程序调用“链接行动“,是提取的数字,或\2

这使我获得了我想要的大部分内容,但是如果系列中有多于两个数字,用逗号+空格分隔,则它与中间数字不匹配。我想,如果我找不到更好的方法,我会亲自去做。

我知道我在这里磕磕绊绊......感谢您的帮助,感谢您耐心等待新手! (如果我这样做,所以它是完全自动化的,我会成为上帝在工作......)

相关问题