정규식을 사용하여 대괄호 찾기사양 제한에 대한 수치를 추출하려는 고객이 있습니다. 그는 텍스트가 괄호를 사용하지만 대괄호를 사용하지 않는 경우 이를 수행할 수 있습니다.대괄호 "[" 및 "]"는 특수 정규식 문자이므로 이스케이프 문자 "\" 또는 "\\"를 사용하면 도움이 될 것이라고 생각했지만 제대로 작동하지 않았습니다.
그가 검색하는 텍스트는 [0.080, 1.20]처럼 보일 수 있으며 정규식을 사용하여 0.080과 1.2를 얻으려고 합니다.
텍스트에서 왼쪽 괄호 "("를 찾기 위한 그의 현재 공식은 다음과 같습니다.
정규식( :텍스트, "((?<=\().+(?=\,))" )
오른쪽 괄호의 경우 ")"를 사용합니다.
정규식( :텍스트, "((?<=\,).+(?=\)))" )
"[" 또는 "]"를 찾기 위해 이러한 수식을 어떻게 수정할 수 있습니까?
"<", ">", "+", "-" 및 "+/-"도 찾을 수 있기를 원합니다.
도움을 주시면 감사하겠습니다.
감사해요!
Re: 정규식을 사용하여 대괄호 찾기\[는 문자열을 구분하는 이스케이프 시퀀스이기 때문에 이것은 항상 나를 트립합니다. 먼저 이스케이프하면 정규식 메타문자를 나타내는 데 사용할 수 있습니다.
Num( Regex( :String, "\!\[([0-9\.eE\+\-]+)", "\1" ) )
첫 번째 숫자
Num( Regex( :String, "\!\[([0-9\.eE\+\-]+)\s*,([0-9\.eE\+\-]+)", "\2" ) )
두 번째로.
Re: 정규식을 사용하여 대괄호 찾기안녕 찰리,
텍스트가 어떻게 생겼는지 감이 오시나요? 고객은 정규식이 필요하지 않을 수도 있습니다. 이러한 경우 결과 JSL은 구현 및 유지 관리가 훨씬 쉬운 경우가 많습니다.
예를 들어:
Names Default To Here(1);
text = "this is a bunch of text with some data in it between brackets [2.3, 4.5] like so.";
specTxt = word(2, text, "[]");
specLo = num(word(1, specTxt, ","));
specHi = num(word(2, specTxt, ","));
show(specLo, specHi);
Re: 정규식을 사용하여 대괄호 찾기그러나 16파운드 대형 해머가 더 크게 터질 때 압정 해머를 사용하는 이유는 무엇입니까?
Re: 정규식을 사용하여 대괄호 찾기가지다! 사실입니다.
Re: 정규식을 사용하여 대괄호 찾기이것은 사용자가 토론 더 큰 JMP 사용자 커뮤니티에서 얻을 수 있는 응답의 속도와 품질을 확인하기 위해 보드를 사용합니다.
개인적으로 Regex를 배운 적이 없으므로 문자 기능 대부분의 문자열 조작을 위해. 특히 Word() 함수는 저에게 놀라운 기능을 합니다.
수식편집기 함수 하나만 배운다면 워드()가
Re: 정규식을 사용하여 대괄호 찾기이것은 좋은 생각입니다. 또한 사람들이 내가 한 일을 얼마나 자주 하는지, 사용자가 무엇을 하려고 하는지 생각하기보다 질문에 직접 답하여 간단하고 더 우아한 해결책을 제시하는지 궁금합니다. 사용자가 원하는 것이 아니라 사용자가 필요로 하는 것을 이해하는 것이 항상 더 좋습니다.
Re: 정규식을 사용하여 대괄호 찾기다음은 정규식을 사용하는 방법에 대한 또 다른 예입니다.
Names Default to Here( 1 );
// source
string = "My spec limits are [0.080,1.20] for this CQA.";
// method 1: successive calls to Regex()
lsl = Num( Regex( string, "(\d*\.?\d*),(\d*\.?\d*)", "\1" ) );
usl = Num( Regex( string, "(\d*\.?\d*),(\d*\.?\d*)", "\2" ) );
// method 2: one call to Regex Match, then convert items
limit = Regex Match( string, "(\d*\.?\d*),(\d*\.?\d*)", "\2" );
lsl = Num( limit[2] );
usl = Num( limit[3] );
Re: 정규식을 사용하여 대괄호 찾기감사합니다 브래디!귀하의 솔루션을 시도했는데 작동합니다.나는 단순함을 좋아한다."[" 또는 "("에 대한 단어 검색을 할 수 있는 방법이 있습니까?그것이 고객이 찾고 있는 것에 더 가깝다고 생각합니다.
다시 한번 감사합니다!
백인
Re: 정규식을 사용하여 대괄호 찾기고마워 돈!귀하의 솔루션은 대괄호에 적합합니다.두 경우 모두 작동하도록 "(" 또는 "[" 중 하나를 검색하도록 하는 방법이 있습니까?
감사해요!
백인
Re: 정규식을 사용하여 대괄호 찾기표시-
솔루션을 작동시키는 데 약간의 문제가 있었습니다.샘플 데이터 표를 첨부했습니다.보시고 제가 뭘 잘못하고 있는지 알려주실 수 있나요?
감사해요,
백인
Re: 정규식을 사용하여 대괄호 찾기감사합니다 제프.나는 정규식을 전혀 모르고 문자 기능도 사용하려고합니다.그러나 고객이 쉽게 적용할 수 있도록 고객이 하고 있는 방식과 매우 유사한 기술을 사용하여 고객의 질문에 답하고 싶었습니다.
나는 그가 커뮤니티에 그것을 게시하도록 격려했습니다.우리는 무슨 일이 일어나는지 볼 것입니다.
감사해요!
백인
Re: 정규식을 사용하여 대괄호 찾기안녕 찰리,
word() 함수에는 3개의 인수가 있으며 마지막 인수인 구분 기호 세트는 선택 사항입니다. 고려하려는 모든 구분 기호를 포함하는 인용 문자열입니다. 따라서 사용자는 대괄호와 괄호를 이 문자열에 넣습니다.
word( )가 함수를 어떻게 분해하는지 보려면 words() 함수에서 반환되는 내용을 조사하는 것이 도움이 될 수 있습니다. Words()는 구분 후 모든 텍스트 조각 목록을 반환합니다.
예를 들어:
단어(2, "Hit the road jack")는 "the"를 반환합니다.
word(2, "Hit the road jack", "")는 "i"를 반환합니다. 텍스트를 개별 문자로 나누려고 할 때 빈 문자열이 사용되기 때문입니다.
word(1, "abc/def[ghi]klm", "[]()") 는 "abc/def"를 반환합니다... words( "abc/def[ghi]klm", "[]()" )를 보면
{ "abc/def", "ghi", "klm" } 결과로.
도움이 되었기를 바랍니다.
건배,
브래디
Re: 정규식을 사용하여 대괄호 찾기Regex를 정말로 사용하려면 다음 문자열을 상위 또는 하위에 사용할 수 있습니다.
"[\!\[|\(]([0-9\.eE\+\-]+)\s*,\s*([0-9\.eE\+\-]+)"
유일한 차이점은 두 번째 인수인 "\1"은 하위 인수이고 "\2"는 상위 인수입니다. 무슨 일이 일어나고 있는지 이해하려면 표현이 네 부분으로 되어 있다고 생각하십시오.
[\!\[|\(]
[a|b]는 a 또는 b와 일치하며 대괄호와 괄호는 모두 특수 문자이므로 백슬래시를 사용하여 이스케이프해야 합니다. 시퀀스 \[도 JSL에서 특별하기 때문에 ! 특별한 시퀀스가 아님을 나타냅니다.
([0-9\.eE\+\-]+)
괄호는 그 안에 포함된 표현식을 캡처합니다. 이것이 \1이 가리키는 것입니다. 다시 말하지만 대괄호는 문자 집합을 지정하는 데 사용됩니다. 이 경우 숫자, 마침표(특수 문자가 이스케이프 처리됨), 더하기(동일함), 빼기(동일함), 소문자 또는 대문자 E 중 하나 이상(끝에 있는 +로 인해)입니다. 숫자를 나타내는 데 사용할 수 있는 잊어버린 문자가 있으면 여기에 입력하세요.
\s*,\s*
0개 이상의 공백, 쉼표, 0개 이상의 공백
([0-9\.eE\+\-]+)
처음 캡쳐한 것과 같은 표정. \2로 참고. 좋은 점은 여기까지 왔으면 멈출 수 있다는 것입니다. 닫는 대괄호나 괄호를 캡처할 필요가 없습니다(제가 아는 한). 당신이 원한다면 할 수 있습니다.
이 모든 것은 Brady의 솔루션을 사용하겠다고 말했습니다. 더 간결하고 이해하기 쉽습니다. 구분 기호 집합에 쉼표를 추가해야 합니다. 즉,
"[(,])"
Re: 정규식을 사용하여 대괄호 찾기이전 예제에는 쉼표 뒤에 공백이 포함되지 않았습니다. 수정된 스크립트 예는 다음과 같습니다.
Names Default to Here( 1 );
// source 1
string = "My spec limits are [0.080, 1.20] for this CQA.";
// method 1: successive calls to Regex()
lsl = Num( Regex( string, "(\d*\.?\d*),\D*(\d*\.?\d*)", "\1" ) );
usl = Num( Regex( string, "(\d*\.?\d*),\D*(\d*\.?\d*)", "\2" ) );
Show( lsl, usl );
// method 2: one call to Regex Match, then convert items
limit = Regex Match( string, "(\d*\.?\d*),\D*(\d*\.?\d*)", "\2" );
lsl = Num( limit[2] );
usl = Num( limit[3] );
Show( lsl, usl );
// source 2
string = "My spec limits are (0.080, 1.20) for this CQA.";
// method 1: successive calls to Regex()
lsl = Num( Regex( string, "(\d*\.?\d*),\D*(\d*\.?\d*)", "\1" ) );
usl = Num( Regex( string, "(\d*\.?\d*),\D*(\d*\.?\d*)", "\2" ) );
Show( lsl, usl );
// method 2: one call to Regex Match, then convert items
limit = Regex Match( string, "(\d*\.?\d*),\D*(\d*\.?\d*)", "\2" );
lsl = Num( limit[2] );
usl = Num( limit[3] );
Show( lsl, usl );
수정된 수식이 포함된 데이터 표를 첨부했습니다.
Re: 정규식을 사용하여 대괄호 찾기아래의 데이터를 잘 이해하지 않고 Regex를 구현하기가 얼마나 까다로울 수 있는지에 대한 좋은 예입니다. 공간의 유무가 차이를 만들었다.
이제 적법한 숫자 형식이 지원되어야 한다고 가정합니다. 이 경우 과학적 표기법, 음수, 마침표(또는 아님) 등을 고려해야 하기 때문에 Regex는 더 추해집니다.
이러한 경우 JSL 함수와 Regex를 조합하면 둘 중 하나만 사용하는 것보다 더 쉽게 작업을 완료할 수 있습니다.
예를 들어, 아래 JSL에서:
1) 대괄호와 괄호를 중괄호로 대체합니다(목록 연산자... 포인트 3에서 중요).
2) Regex는 중괄호와 그 안에 포함된 내용을 가져옵니다. 형식에 관계없이 적법한 숫자 쌍으로 가정합니다.
3) Parse는 Regex가 반환한 문자열을 specLo 및 specHi에 목록 내용을 할당하는 JSL 표현식으로 변환합니다.
txt = "My spec limits are [-4.087e-3, 1.20] for this CQA.";
{specLo, specHi} = Parse( Regex( Substitute( txt, "(", "{", "[", "{", ")", "}", "]", "}" ), "\\!{.*\\!}" ) );
-브래디
Re: 정규식을 사용하여 대괄호 찾기당신의 도움을 주셔서 감사합니다!