문자열의 숫자 구절을 세어보세요이것은 아마도 매우 구체적인 것일 것입니다. 하지만 JMP 셀에 포함된 문자열이 있고 문자열에서 숫자 문자의 특정 구절을 분리할 수 있어야 합니다. 문자열에는 문자와 숫자가 모두 포함되어 있으며 시퀀스는 가변적일 수 있습니다. 예를 들어 셀 항목이 있는 경우
aaa1b222c3
그리고 222번째 구절에 집중하고 싶어서 숫자로 된 구절의 개수를 3개로 세고 그 중 두 번째 구절을 분리하는 방법을 고려했습니다.
저는 정규 표현식으로 이 작업을 하는 방법을 생각해냈지만 너무 복잡해서 게시할 가치가 없습니다. 거기에 도달하는 더 적응적인 방법이 있을 거라고 확신합니다. 모든 아이디어에 감사드립니다.
안녕
스패너헤드
자동화 및 스크립팅Re: 문자열의 숫자 구절 세기가능한 문자열과 분리하고자 하는 부분에 대한 예를 더 제공해 주시겠습니까? 또한 그 부분으로 무엇을 하시겠습니까? 추출하시겠습니까? 제거하시겠습니까? 존재하는지 확인하시겠습니까?
Re: 문자열의 숫자 구절 세기자르모
제 전반적인 목표는 셀 입력으로 숫자 값을 포함하는 새 열을 만드는 것입니다. 이는 원래 항목에 차원 정보가 포함되어 있고 숫자 형태로 자동으로 사용할 수 있기를 원하기 때문에 파생되었습니다. 숫자 구절 중 하나는 길이이고 다른 하나는 너비입니다. 다른 숫자가 포함되어 있으며 이를 우회할 수 있는 수단이 필요합니다. 실제 문자열은 다음과 더 가깝습니다.
발1b200X300
200 길이 x 300 너비의 장치이고 해당 값을 반영하여 생성된 셀이 들어 있는 새 열이 필요합니다. 추가 숫자 문자는 길이나 배치가 일관되지 않아 작업에 복잡성이 더해집니다.
안녕
스패너헤드
Re: 문자열의 숫자 구절 세기항상 세 글자인가요? 항상 마지막 두 숫자인가요? 항상 "X"로 구분되어 있나요?
Re: 문자열의 숫자 구절 세기자르모
머피의 법칙을 부분적으로 위반. 항상 길이가 같지는 않고, 항상 마지막 2개 숫자는 아니지만 항상 X로 구분됨.
안녕
스패너헤드
Re: 문자열의 숫자 구절 세기이것으로 충분할 수도 있고 몇 가지 추가 조건을 추가해야 할 수도 있습니다(시작/끝에 있는지 또는 앞/뒤에 문자가 있는지 확인하십시오)
Names Default To Here(1);
str = "Val1b200X300abcc1";
r = Regex Match(str, "(\d+)X(\d+)");
Show(Num(r[2]), Num(r[3]));
Re: 문자열의 숫자 구절 세기자르모
훌륭한 자료입니다! 결국 제가 생각해 낸 것이 있습니다. 레이블은 제가 수술을 시도하는 문자열이 들어 있는 열입니다.
New Column("Width", Character, "Nominal", Formula(Regex(:Label, "(\d+)X", "\1")), Set Selected);
New Column("Length", Character, "Nominal", Formula(Regex(:Label, "X(\d+)", "\1")), Set Selected);
효과가 있는 것 같습니다.
안녕
스패너헤드
Re: 문자열의 숫자 구절 세기이는 데이터에 따라 달라지지만 정규식 패턴에 작은 추가 기능을 추가할 수 있습니다. X의 다른 쪽에 있는 다른 숫자에 대한 검사를 추가하여 "1Xa"와 같은 문제가 발생하지 않도록 합니다.
Names Default To Here(1);
strs = {"A1X2", "A1Xa", "1X2", "a1X23", "aX2", "A1X2a"};
For Each({str}, strs,
a1 = Regex(str, "(\d+)X", "\1");
a2 = Regex(str, "X(\d+)", "\1");
// vs
b1 = Regex(str, "(\d+)X(\d+)", "\1");
b2 = Regex(str, "(\d+)X(\d+)", "\2");
Write("\!NCurrent string: ", str);
Write("\!NFirst pattern matches: ", a1, " ", a2);
Write("\!NSecond pattern matches: ", b1, " ", b2);
Write("\!N");
);
Current string: A1X2
First pattern matches: 1 2
Second pattern matches: 1 2
Current string: A1Xa
First pattern matches: 1 .
Second pattern matches: . .
Current string: 1X2
First pattern matches: 1 2
Second pattern matches: 1 2
Current string: a1X23
First pattern matches: 1 23
Second pattern matches: 1 23
Current string: aX2
First pattern matches: . 2
Second pattern matches: . .
Current string: A1X2a
First pattern matches: 1 2
Second pattern matches: 1 2
Re: 문자열의 숫자 구절 세기또한 초기 문제에 대한 저의 첫 번째 이해는 문자열에서 가장 긴 숫자 시퀀스를 추출하는 것이었고, 이에 대한 몇 가지 스크립트를 소개합니다(누군가에게 유용할 수도 있음).
1. Words() 사용(비숫자 문자열 추출에도 유사한 아이디어 사용 가능)
Names Default To Here(1);
str = "aaa1b222c3";
alphabets = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
nums = Words(str, alphabets);
lengths = Transform Each({num}, nums, Output("Matrix"), Length(num));
l_idx = Loc Max(lengths);
longest_num_seq = nums[l_idx];
show(nums, longest_num_seq); //nums = {"1", "222", "3"}, longest_num_seq = "222";
2. While + 정규식 사용
Names Default To Here(1);
str = "aaa1b222c3";
nums = {};
strcopy = str;
While(!IsMissing(match = Regex(strcopy, "\d+")),
idx = Contains(strcopy, match);
Insert Into(nums, match);
Remove From(strcopy, idx, Length(match));
);
l_idx = Loc Max(lengths);
longest_num_seq = nums[l_idx];
show(nums, longest_num_seq); //nums = {"1", "222", "3"}, longest_num_seq = "222";