나는 RegEx에 능숙하지만 그것이 어떻게 작동하는지 알 수 없는 한 가지가 있습니다.
NotePad++에서 어떻게 검색/바꾸고 출력의 길이가 고정되어 있고 입력은 유연할 수 있는지 확인하려면 어떻게 해야 합니까?
예를 들어, 다음과 같은 정규식을 수행 23-6-2016
하면 됩니다 : 23-06-2016
(06에는 추가 0이 있지만 예를 들어 12인 경우에는 해당되지 않음)
또 다른 옵션은 다음을 만드는 것입니다.
TestString
그리고 Test
될 것입니다
TestString______________________
(여분의 공백.)
Test____________________________
(여분의 공백.)
물론 여기서의 아이디어는 출력의 길이가 모두 동일한 대량 검색/바꾸기를 수행하는 것입니다.
그 뒤에 숨겨진 생각을 설명해주세요.
편집: 작업 중인 데이터에 대한 아이디어를 제공하기 위해 처리해야 하는 행의 예는 다음과 같습니다.
12345678 TXT 19700101 0 100 20160624 100 Comment text
12345678 TXT 19700101 100 100,25 20160624 0,25 Comment text
12345678 TXT 19700101 100,25 100,5 20160624 0,25 Comment text
탭으로 구분되어 있습니다. 첫 번째 줄의 첫 번째 0은 0,00, 100은 100,00 형식이어야 하지만 12345678과 날짜는 ,00 형식으로 지정하면 안 됩니다. 마지막 100,5는 100,50 형식이어야 합니다.
데이트 문제는 이미 해결했으니 지금은 그게 덜 중요해요.
답변1
응답:
12345678 TXT 19700101 0 100 20160624 100 댓글 내용 12345678 TXT 19700101 100 100,25 20160624 0,25 댓글 내용 12345678 TXT 19700101 100,25 100,5 20160624 0,25 댓글 텍스트
4번째 열의 경우:
^((?:\S+\s+){3}\d+)(\s)
to \1,0\2
^((?:\S+\s+){3}\d+,\d)(\s)
to\10\2
5/7번째 열:
위와 유사합니다. 규칙에서 각각 / {3}
로 바꾸세요.{4}
{6}
그만큼첫 번째 규칙,0
없는 숫자에 추가됩니다 ,
. 이제 모든 숫자에는 가 있어야 합니다 ,\d
.
그만큼두 번째 규칙0
쉼표 뒤에 한 자리 숫자가 있는 경우에는 a를 추가합니다 .
에 관해서는(?:)
:비캡처 그룹, 이전 열은 이미 캡처되었으므로 \1
추가 캡처가 필요하지 않습니다.
숫자를 소수점 이하 2자리까지만 채웁니다. 임의의 양을 채우려면 pad excessively, then trim
접근 방식을 사용하십시오.
마지막 말?
제 생각에는 notepad++와 같은 일반 정규식은 이 작업에 적합하지 않습니다. Bash나 Perl과 같은 일부 기본 스크립팅을 사용하면 훨씬 더 높은 가독성으로 이를 처리할 수 있습니다.
답변2
섹션 A: 특정 길이의 패드
정규식을 사용하여 N 문자로 줄을 오른쪽 채우려면 줄 끝에 N 공백을 추가한 다음 첫 번째 N 문자를 그룹화하여 나머지 문자를 대체합니다.
패스 1: 패딩 문자 추가
찾기: $
바꾸기:______________________________
줄 끝에 공백 30개를 추가합니다. (게시물에서는 공백이 형식화되지 않기 때문에 밑줄을 사용했습니다.)
패스 2: 왼쪽 30자 자르기
줄 시작 부분에 대시로 구분된 날짜를 추가하려면 그에 따라 각 섹션을 일치시키세요.
찾기: ^([[:print:]]{0,30}).*$
다음으로 바꾸기\1
줄 시작 부분에서 최대 30개의 인쇄 가능한 문자 그룹과 나머지 문자를 그룹으로 바꿉니다.
다른 선 길이를 선택하려면 패스 1에서 n 공백을 사용한 다음 30을 패스 2의 길이로 바꿉니다.
섹션 B: 날짜로 시작하는 줄
패스 1(월의 날짜):
찾을 내용: ^([0-9])-
다음으로 대체:0\1-
패턴(단일 숫자로 시작하고 대시가 오는 줄)을 패딩된 0, 숫자 및 대시로 바꿉니다.
패스 2(월):
찾을 내용: -([0-9])-
다음으로 대체:-0\1-
패턴(두 대시 사이의 단일 숫자)을 대시, 패딩된 0, 숫자 및 대시로 바꿉니다.