정규식 도움말 -안녕하세요, Regex 기능을 사용하려면 도움이 필요합니다.
문자열은 다음과 같습니다 -
"괜찮습니다.2020.선택사항.(없음)"
필수 -- "Fine_2020_Optional"
몇 가지 조합을 시도했지만 하나의 정규식으로 결과를 얻을 수 없습니다. 내 for 루프 스크립트에서 이러한 유형의 Regex를 사용하고 있습니다.
도움이 필요하세요?
감사해요.
Re: 정규식 도움말 -감사해요. 이것은 매우 도움이 됩니다Re: 정규식 도움말 -@Craige_Hales 쿠도 x 10^6
감사합니다
Re: 정규식 도움말 -안녕 @바이런_JMP !
나는 다음과 같이 할 수 있습니다 :
source = "(aaa).Fine.2020.Optional.(Not).more.(leave out).last.(bbb)";
//
// remove text between parens, change . to _
//
parts = {}; // accumulator list of the individual parts
ipart = 0; // index to the parts list
rc = Pat Match( // test the rc (below) to make sure the match worked
source,
patpos(0) // PatRepeat must start at the beginning.
+
Pat Repeat(
( "." | Pat Pos( 0 ) ) // advance past a required period, or begin of string
+ // followed by either...
(
( "(" + Pat Break( ")" ) + ")" )
// above: match open paren and stop on a close paren. Parens and everything
// between is rejected by not adding anything to the list of parts.
| // or
( ( Pat Break( "." ) | Pat Rem() ) >> parts[ipart += 1] )
// above: scan forward up to, but not including, a period, or if
// that doesn't work, to the end (remainder) of the string.
// ipart += 1 adds 1 before subscripting. It is OK to add an item
// to a list just beyond the end of the list. The >> operator stores
// the matched value on its left into the variable on its right.
)
)
+
patrpos(0) // PatRepeat must stop at the end.
);
// re-join the parts with the _ separator
result = if(rc,Concat Items( parts, "_" ),"problem with match");
show(result);결과 = "Fine_2020_Optional_more_last";
꽤 길고 꽤 불투명합니다(정규식만큼 불투명하지는 않을 수도 있습니다). 하지만...
- Regex()는 실제로 여러 대체를 만드는 것을 목표로 합니다. GLOBALREPLACE는 효율적으로 수행됩니다. 제거하려면 두 번째 정규 표현식이 필요할 수 있습니다( 텍스트 ), 둘 이상이 있을 수 있는 경우 GLOBALREPLACE도 사용합니다.
- Jeff의 예에서는 Word()도 좋습니다. 보관할 개수와 (텍스트)가 표시되는 위치를 알고 있는 경우 . 단순성과 유지 관리 용이성, 그리고 속도 측면에서도 이 제품을 이길 수 없습니다.
- PatMatch()는 다른 곳에서도 빛을 발합니다. 실제로는 정보를 추출하거나 기껏해야 단일 위치에서 문자열을 처리하는 데 사용됩니다(GLOBALREPLACE는 없습니다). 이 예에서는 정보를 추출하여 부품 목록을 만든 다음 부품을 다시 조립하는 PatMatch()를 보여줍니다.
반면에 이것은 패턴 일치를 사용하여 문자열에서 정보를 추출하는 방법에 대한 훌륭한 소개입니다. 실제 이점은 단일 일치에서 구문 분석할 수 있는 긴 문자열(위와 같이 짧은 문자열)에서 비롯됩니다. 일치에는 시작 오버헤드가 한 번만 있기 때문입니다. PatRepeat가 한 번에 문자열을 탐색하도록 하고 문자열을 수정하지 않으면 일치 속도가 매우 빨라질 수 있습니다.
Re: 정규식 도움말 -패턴 일치도 좋은 해결책이 될 수 있지만 구문에 계속 문제가 발생합니다. 주변에 snbol을 잘하는 사람이 있었다면... @Craige_Hales
Re: 정규식 도움말 -문자열 조작을 위해 내장된 JMP 함수를 잊지 마세요. 대리자() , 멍거() 그리고, 내가 좋아하는 것 , 단어() . 이와 같은 구문은 처리하기가 더 쉬울 수 있습니다.
str="Fine.2020.Optional.(Not)";
show(substitute(str, ".", "_"));
show(word(1, str, ".") || "_" || word(2, str, ".") || "_" || word(3, str, "."));
show(concat items(words(str, ".")[1::3], "_"));
통나무:
Substitute(str, ".", "_") = "Fine_2020_Optional_(Not)";
Word(1, str, ".") || "_" || Word(2, str, ".") || "_" || Word(3, str, ".") = "Fine_2020_Optional";
Concat Items(Words(str, ".")[Index(1, 3)], "_") = "Fine_2020_Optional";
Re: 정규식 도움말 -좋습니다. 오프라인에서 매우 짧은 솔루션에 대한 몇 가지 의견을 받았습니다.
직접 가는 방법은 다음과 같습니다. 속임수일 수도 있지만 훨씬 쉽습니다.
그 예시를 가지고 표를 만들어 봤습니다. 컬럼을 선택하고 레코드를 사용했습니다.
Recode에서는 대체 문자열을 사용하고 정규 표현식을 켰습니다.
녹음 대화 상자에서 두 스크립팅 옵션을 모두 켰습니다(오른쪽 하단).
그런 다음 스크립트 창에 스크립트를 저장하고, 조금 복사하여 여기에 붙여넣었습니다. (글쎄, 작동하는지 확인한 다음 붙여넣었습니다.)
엄청난 감사 @ErnestPasour 


아, 그리고 "\"를 사용하는 부분도 있어요. "."보다는 홀로. 백슬래시는 이스케이프 문자이며 모든 것을 "_"로 바꾸지 않습니다. 이것이 이 작업을 수행하는 데 필요한 유일한 정규식 지식입니다.
Re: 정규식 도움말 -정규식 ( "this.is.jmp" , "\." , "_" , 글로벌 교체 );
Re: 정규식 도움말 -이것은 정말 도움이 됩니다. 감사해요.
Re: 정규식 도움말 -이 웹사이트에는 Regex에 대한 유용한 일반 정보가 있습니다.
https://www.regular-expressions.info/quickstart.html
입력 및 예상 출력을 기반으로 정규식을 생성하는 도구도 있습니다.
http://regex.inginf.units.it/
Re: 정규식 도움말 -폴님, 감사합니다.
더 간단한 것이 거의 없어서 할 수 있었지만 이것이 바로 그것이었습니다. 그것은 나에게 약간의 문제를 안겨주었다. 다음번에 문제가 발견되면 더 자세한 내용을 알려드리겠습니다. 좋은 예가 포함된 Regex에 대해 나와 공유할 수 있는 참조/링크가 있습니까? 그것은 매우 도움이 될 것입니다.
다시 한 번 감사드립니다.Re: 정규식 도움말 -입력 및 예상 출력에 대한 더 많은 예와 전화가 끊기는 부분이 있으면 도움이 될 것입니다. 아래 JSL은 귀하의 단일 사례에 적용되지만 일반적으로 모든 데이터에 적용 가능한지는 확실하지 않습니다.
Regex("Fine.2020.Optional.(Not)",
"(\w+?)\.(\d+?)\.(\w+?)\.\(\w+?\)",
"\1_\2_\3"
);