2017-03-05 4 views
0

이 문장을 명확하게하려고합니다 ... (저는 정규식에서 꽤 새로 왔습니다). AutoBookmark라는 프로그램 (Evermap에서)을 사용하여 PDF 문서 작업을하고 있습니다. 참고 문헌에서 번호가 매겨진 인용과 번호가 매겨진 인용을 연결하도록 설정하려고합니다.대괄호 안에 N (1 ~ 3 자리) 숫자의 쉼표 + 공백이있는 정규식

목표는 각 번호 매기기 인용 부호를 대괄호로 묶고 그 번호를 대괄호로만 반환하는 것입니다. 다른 말로하면, 내가 [85]을 가지고 있다면, 나는 [85]를 반환 할뿐입니다. 내가 [85, 93]을 가졌다면 [85]와 [93] 둘 다 돌려 줄 것입니다. 대괄호 안에 숫자가 N 개 이상있는 경우 대괄호 안에 N 개를 반환합니다. 범위가있는 경우 (예 : [85-93]) 첫 번째 값만 반환하면됩니다.

이렇게 나에게 묻는 것은 다음과 같습니다. 숫자 (1 ~ 3 자리), 앞뒤가 괄호로 묶이거나 다른 숫자 뒤에 쉼표와 공백이 오는 경우에만 해당 번호가있는 경우에만 앞에 괄호가 오거나 쉼표와 공백이 뒤에 오는 숫자로 표시됩니다. 대괄호 (숫자를 반환) 또는 숫자가 아닌 숫자를 칠 때까지 반복합니다.이 경우 숫자를 반환하지 않습니다. 정규 표현식을 요청하는 것이 합리적일까요? 또는 PDF에서이 작업을 수행하고 있으므로 Javascript 루틴을 수행해야합니까? (어떤 BTW, 나는 또한 어떻게 해야할지 모른다!) 고마워! 나는 이것에 초보자 인 것을 알고, 나는 어떤 생각든지을 위해 고맙게 여긴다.

+0

내가 이해할 수없는 두 가지 것들이있다 : 1) 왜이 태그는'javascript'인가? 이 AutoBookmark 프로그램이 자바 스크립트를 실행할 수 있습니까? 2) "괄호 안의 숫자"를 정확히 말하면 무엇을 의미합니까? '[1, 2]'의 모든 항목을'[1] [2]'또는 다른 정규식으로 바꾸고 싶습니까? –

+0

나는 알고있다. 나는 훈련이 없으며 틀린 말을하고있다. 그러나 기본적으로 그렇습니다. 이는 "모든 발생 바꾸기"와 동일합니다. 내가 (메일에 답을 얻지 못하는) 것은 ((? <= \ [) | (? <= (\ d))) (\ d {1,3})'이다. 이것은 너무 많이 캡처합니다. 왜냐하면 텍스트에 일련의 숫자가있을 수도 있기 때문입니다. 나는 원하지 않습니다. 내가해야한다면, 나는 그걸로 살 수 있습니다 - 나는 오히려 놓치기보다 몇 가지 잘못된 링크를 더 가질 것입니다. –

답변

1

이 프로그램에 대한 경험은 없지만 this은 javascript와 함께 작동해야하며, Regex의 다른 기능은 최소한의 구현입니다.

\[?   # 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+)\s*(?=(?:,\s*\d+)+|\])(?=[^\[]*\]).

뿐만 아니라 유효한 문자가 앞에 붙습니다.

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

인용을 포맷은 100 % 신뢰할 수있는 경우 프로그램이 가변 길이 lookbehinds을 지원하는 경우 [1], [12], [13, 14, 21] 등 당신은, \[(?<=\[[,\d ]*)(\d+)(?=(?:, \d+)|\])(?=[^\[]*\]).simpler version

\[?\s*(\d+)(?=(?:, \d+)|\])(?=[^\[]*\]).하거나 사용할 수 있습니다. 이러한 식의와

: \]?에 당신은 마지막 문자를 변경할 수 . 는 여전히 쉼표 [1],[15],[22]로 구분하여 인용을 볼 수 있습니다. 정규 표현식의 많은 맛을

* 모든에서 지원되는 경우, 한정사와 같은 폭되는 모든 교대와 고정 길이 있어야합니다 을 lookbehinds--. 예를 들어 (?<=a|1)은 작동하지만 (?<=a|12), (<=a|1+) 또는 (<=a+)은 실패합니다. lookbehind 자체에 적용되는 한정 기호는 다음과 같습니다. (?<=a)+

편집 : 입력 용 Rawing에 감사드립니다.

+1

멋진 정규식이지만 개선 할 수있는 몇 가지 세부 정보가 있습니다. 1)'(? : \ [\ s * | \ s *)'는'\ [? \ s *'일 수 있습니다. 2) 첫 번째 lookahead에서'\ s *'와''\ s * '를 두 번 연속해서 매치한다 :'\ s * (? = ... | \ s * \])'이것은 위험 할 수 있고'\ s * (? = ... | \))'. 3)', \ s * \ d +'를'[, -] \ s * \ d +'로 변경하면'[1-2]'형식의 인용과도 일치합니다. –

+0

@Rawing 1과 2 번 카운트에서 당신이 맞습니다. 그리고 '-' 지원이 많은 정규 표현식 정규 표현식에서 좋은 기능이지만, 나는 여기가 맞지 않는다고 느꼈습니다. 감사합니다. 특히 우발적 인 이중'\ s *' –

0

제안 해 주셔서 감사합니다. 여기 무슨 일이 일어나는가? 분명히 Evermap은 가변 길이 검색을 이해하지 못하므로 다른 것들을 시도해 보았습니다. 그들은 모든 결과가 아니라 일부 결과를 제공합니다. 대괄호로 묶은 간단한 숫자와 일치하며 대괄호 안에있는 일련의 마지막 번호와 일치합니다.

AutoBookmark는 텍스트 패턴을 검색하는 "다중 규칙"방식을 제공하므로 [35] 또는 [35 또는 35] 또는 35 또는 35를 모두 개별적으로 검색 할 수 있습니다. 는 '대체'이 각각에 대해

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

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

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

, 또는 어떤 프로그램 호출 '링크 : 현재

, 나는 세 가지 규칙을 사용하고 있습니다 동작 '은 추출 된 번호 또는 \2입니다.

이것은 내가 원하는 대부분을 얻지 만, 시리즈에 두 개 이상의 숫자가있는 경우 쉼표 + 공백으로 구분되어 중간 숫자와 일치하지 않습니다. 나는 더 나은 방법을 찾을 수 없다면 나는 손으로 그것을 할 것이라고 생각한다.

나는 여기에서 우연히 만나는 것을 알고있다. 도와 줘서 고마워. 초보자 인내심에 감사드립니다. (만약 내가 이것을 풀어서 완전히 자동화한다면, 나는 직장에서 신이 될 것이다 ...)