0

我将尝试清楚地表达这一点......(我对正则表达式很陌生)。我正在使用一个名为 AutoBookmark(来自 Evermap)的程序处理 PDF 文档。我正在尝试将其设置为将编号的引文链接到参考书目中的编号参考文献。

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

所以在我看来,我在问这个:数字(1 到 3 位数字),只有在前面有一个左括号,或者另一个数字后跟一个逗号和一个空格,但前提是这个数字前面有一个开头括号或数字后跟逗号和空格,但前提是......你得到了图片。迭代直到你碰到一个括号(然后返回数字)或非数字,在这种情况下,不要返回数字。这对正则表达式来说是否合理?或者,由于我在 PDF 中执行此操作,我必须执行 Javascript 例程吗?(顺便说一句,我也不知道该怎么做!)谢谢!我知道我是这方面的新手,我很感激任何想法。

4

2 回答 2

1

我对这个程序没有经验,但这应该适用于 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

如果这个程序支持可变长度的书后,你可以使用它,它只添加一个后视以确保数字也以有效字符为前缀。

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

如果您的引文格式是 100% 可靠[1]的 , [12],[13, 14, 21]等。您可以使用更简单的版本

\[?\s*(\d+)(?=(?:, \d+)|\])(?=[^\[]*\]).或者,如果您的程序支持可变长度的后视,\[(?<=\[[,\d ]*)(\d+)(?=(?:, \d+)|\])(?=[^\[]*\])..

使用这些表达式中的任何一个:您可以更改最后一个字符 ,.\]?查看仍以逗号分隔的引文[1],[15],[22]

*在许多正则表达式的风格中,lookbehinds——如果完全支持的话,必须是一个没有量词的固定长度,并且所有的交替都是相同的宽度。例如,(?<=a|1)将工作但(?<=a|12)(<=a|1+)(<=a+)将失败。量词也将应用于lookbehind本身(?<=a)+

编辑:感谢 Rawing 的输入。

于 2017-03-05T06:47:21.170 回答
0

感谢您的建议!这就是发生的事情。显然,Evermap 不理解可变长度的环视,所以我尝试了你的其他环视。他们给出了一些结果,但不是全部。它们匹配括号中的简单数字,它们匹配括号中系列中的最后一个数字。

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

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

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

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

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

对于其中的每一个,“替换”或程序所称的“链接操作”是提取的数字,或\2.

这让我得到了我想要的大部分东西,但是如果一个系列中有两个以上的数字,用逗号+空格分隔,它与中间的数字不匹配。我想,如果我找不到更好的方法,我会用手来做。

我知道我在这里磕磕绊绊......感谢您的帮助,感谢您对新手的耐心!(如果我解决这个问题,让它完全自动化,我将成为工作中的上帝......)

于 2017-03-06T23:48:53.317 回答