Excel에서 정규식을 사용하고 데이터 조작을 위해 Excel의 강력한 그리드와 같은 설정을 활용하려면 어떻게해야합니까?
- 일치하는 패턴 또는 대체 된 값을 문자열로 반환하는 셀 내 함수입니다.
- Sub는 데이터 열을 반복하고 인접한 셀에 일치하는 항목을 추출합니다.
- 어떤 설정이 필요합니까?
- 정규식에 대한 Excel의 특수 문자는 무엇입니까?
내가 정규식이 많은 상황 (적합하지 않습니다 이해 사용하거나하지 정규 표현식을 사용하는? ) 엑셀 사용할 수 있기 때문에 Left
, Mid
, Right
, Instr
유사한 조작에 대한 유형 명령.
답변
정규식 은 패턴 일치에 사용됩니다.
Excel에서 사용하려면 다음 단계를 수행하십시오.
1 단계 : “Microsoft VBScript 정규식 5.5″에 VBA 참조 추가
- “개발자”탭을 선택하십시오 ( 이 탭이 없으면 어떻게해야합니까? )
- ‘코드’리본 섹션에서 “Visual Basic”아이콘을 선택하십시오.
- “Microsoft Visual Basic for Applications”창의 상단 메뉴에서 “도구”를 선택하십시오.
- “참조”를 선택하십시오
- 통합 문서에 포함 시키려면 “Microsoft VBScript Regular Expressions 5.5″옆의 확인란을 선택하십시오.
- “확인”을 클릭하십시오
2 단계 : 패턴 정의
기본 정의 :
-
범위.
- 예를 들어
a-z
a에서 z까지의 소문자와 일치 - 예 :
0-5
0에서 5까지의 숫자와 일치
[]
이 괄호 안의 객체 중 하나와 정확히 일치하십시오.
- 예
[a]
를 들어 문자 a와 일치 - 예 :
[abc]
a, b 또는 c 일 수있는 단일 문자와 일치 - 예
[a-z]
를 들어 알파벳의 소문자 하나와 일치합니다.
()
반품 목적으로 다른 경기를 그룹화합니다. 아래 예를 참조하십시오.
{}
이전에 정의 된 패턴의 반복 사본에 대한 승수입니다.
- 예를 들어
[a]{2}
두 개의 연속 된 소문자 a와 일치합니다.aa
- 예는
[a]{1,3}
적어도 하나의 최대 세 개의 소문자와 일치a
,aa
,aaa
+
이전에 정의 된 패턴 중 하나 이상을 일치시킵니다.
- 예는
a+
일치 연속 A의a
,aa
,aaa
, 등
?
이전에 정의 된 패턴 중 하나 또는 하나를 일치시킵니다.
- 예를 들어 패턴은 존재하거나 존재하지 않을 수 있지만 한 번만 일치 될 수 있습니다.
- 예를 들어
[a-z]?
빈 문자열이나 소문자 하나와 일치합니다.
*
이전에 정의 된 패턴 중 0 개 이상을 일치시킵니다. -존재하거나 존재하지 않을 수있는 패턴을위한 와일드 카드. -예 : [a-z]*
빈 문자열 또는 소문자 문자열과 일치합니다.
.
개행을 제외한 모든 문자와 일치 \n
- 예 :
a.
a로 시작하고 다음을 제외한 모든 것으로 끝나는 두 문자열을 찾습니다.\n
|
OR 연산자
- 예를 들어 또는 일치 할 수 있음을
a|b
의미합니다 .a
b
- 예
red|white|orange
를 들어 색상 중 하나와 정확히 일치합니다.
^
NOT 연산자
- 예를 들어
[^0-9]
문자는 숫자를 포함 할 수 없습니다 - 예를 들어
[^aA]
문자는 소문자a
또는 대문자 일 수 없습니다A
\
뒤에 나오는 특수 문자를 이스케이프 처리합니다 (위의 동작을 무시 함)
- 예
\.
,\\
,\(
,\?
,\$
,\^
고정 패턴 :
^
문자열 시작시 일치해야합니다
- 예 :
^a
첫 문자는 소문자 여야합니다a
- 예를 들어
^[0-9]
첫 문자는 숫자 여야합니다.
$
문자열 끝에서 일치해야합니다.
- 예 :
a$
마지막 문자는 소문자 여야합니다a
우선 순위 테이블 :
Order Name Representation
1 Parentheses ( )
2 Multipliers ? + * {m,n} {m, n}?
3 Sequence & Anchors abc ^ $
4 Alternation |
사전 정의 된 문자 약어 :
abr same as meaning
\d [0-9] Any single digit
\D [^0-9] Any single character that's not a digit
\w [a-zA-Z0-9_] Any word character
\W [^a-zA-Z0-9_] Any non-word character
\s [ \r\t\n\f] Any space character
\S [^ \r\t\n\f] Any non-space character
\n [\n] New line
예 1 : 매크로로 실행
다음 예제 매크로는 셀의 값 A1
을보고 처음 1 또는 2 문자가 숫자인지 확인합니다. 그렇다면 제거되고 나머지 문자열이 표시됩니다. 그렇지 않은 경우 일치하는 항목이 없다는 내용의 상자가 나타납니다. 숫자가 문자열의 시작 부분에 없었기 때문에 셀 A1
값 12abc
은 return abc
, 값 1abc
은 return abc
, abc123
“Not Matched”를 반환합니다.
Private Sub simpleRegex()
Dim strPattern As String: strPattern = "^[0-9]{1,2}"
Dim strReplace As String: strReplace = ""
Dim regEx As New RegExp
Dim strInput As String
Dim Myrange As Range
Set Myrange = ActiveSheet.Range("A1")
If strPattern <> "" Then
strInput = Myrange.Value
With regEx
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = strPattern
End With
If regEx.Test(strInput) Then
MsgBox (regEx.Replace(strInput, strReplace))
Else
MsgBox ("Not matched")
End If
End If
End Sub
예 2 : 셀 내 함수로 실행
이 예는 예 1과 동일하지만 셀 내 기능으로 실행되도록 설정되어 있습니다. 사용하려면 코드를 다음과 같이 변경하십시오.
Function simpleCellRegex(Myrange As Range) As String
Dim regEx As New RegExp
Dim strPattern As String
Dim strInput As String
Dim strReplace As String
Dim strOutput As String
strPattern = "^[0-9]{1,3}"
If strPattern <> "" Then
strInput = Myrange.Value
strReplace = ""
With regEx
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = strPattern
End With
If regEx.test(strInput) Then
simpleCellRegex = regEx.Replace(strInput, strReplace)
Else
simpleCellRegex = "Not matched"
End If
End If
End Function
cell에 문자열 ( “12abc”)을 배치하십시오 A1
. 이 수식 =simpleCellRegex(A1)
을 셀에 입력 B1
하면 결과는 “abc”가됩니다.
예 3 : 루프 스루 범위
이 예제는 예제 1과 동일하지만 셀 범위를 반복합니다.
Private Sub simpleRegex()
Dim strPattern As String: strPattern = "^[0-9]{1,2}"
Dim strReplace As String: strReplace = ""
Dim regEx As New RegExp
Dim strInput As String
Dim Myrange As Range
Set Myrange = ActiveSheet.Range("A1:A5")
For Each cell In Myrange
If strPattern <> "" Then
strInput = cell.Value
With regEx
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = strPattern
End With
If regEx.Test(strInput) Then
MsgBox (regEx.Replace(strInput, strReplace))
Else
MsgBox ("Not matched")
End If
End If
Next
End Sub
예 4 : 다른 패턴을 분리
이 예제는 범위 ( A1
, A2
& A3
) 를 반복 하며 3 자리 숫자로 시작하고 단일 알파벳 문자와 4 자리 숫자로 이루어진 문자열을 찾습니다. 출력은를 사용하여 패턴 일치를 인접한 셀로 분리합니다 ()
. $1
의 첫 번째 세트 내에서 일치하는 첫 번째 패턴을 나타냅니다 ()
.
Private Sub splitUpRegexPattern()
Dim regEx As New RegExp
Dim strPattern As String
Dim strInput As String
Dim Myrange As Range
Set Myrange = ActiveSheet.Range("A1:A3")
For Each C In Myrange
strPattern = "(^[0-9]{3})([a-zA-Z])([0-9]{4})"
If strPattern <> "" Then
strInput = C.Value
With regEx
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = strPattern
End With
If regEx.test(strInput) Then
C.Offset(0, 1) = regEx.Replace(strInput, "$1")
C.Offset(0, 2) = regEx.Replace(strInput, "$2")
C.Offset(0, 3) = regEx.Replace(strInput, "$3")
Else
C.Offset(0, 1) = "(Not matched)"
End If
End If
Next
End Sub
결과 :
추가 패턴 예
String Regex Pattern Explanation
a1aaa [a-zA-Z][0-9][a-zA-Z]{3} Single alpha, single digit, three alpha characters
a1aaa [a-zA-Z]?[0-9][a-zA-Z]{3} May or may not have preceding alpha character
a1aaa [a-zA-Z][0-9][a-zA-Z]{0,3} Single alpha, single digit, 0 to 3 alpha characters
a1aaa [a-zA-Z][0-9][a-zA-Z]* Single alpha, single digit, followed by any number of alpha characters
</i8> \<\/[a-zA-Z][0-9]\> Exact non-word character except any single alpha followed by any single digit
답변
Excel 수식에서 직접 정규식을 사용하려면 다음 UDF (사용자 정의 함수)가 도움이 될 수 있습니다. 그것은 정규 표현식 기능을 엑셀 함수로 거의 직접적으로 노출시킵니다.
작동 원리
2-3 개의 매개 변수가 필요합니다.
- 정규식을 사용할 텍스트입니다.
- 정규식.
- 결과의 모양을 지정하는 형식 문자열입니다.
$0
,,$1
등을 포함 할 수 있습니다$2
.$0
는 전체 일치$1
이며 up은 정규식의 각 일치 그룹에 해당합니다. 기본값은$0
입니다.
몇 가지 예
이메일 주소 추출하기 :
=regex("Peter Gordon: some@email.com, 47", "\w+@\w+\.\w+")
=regex("Peter Gordon: some@email.com, 47", "\w+@\w+\.\w+", "$0")
결과 : some@email.com
여러 부분 문자열 추출하기 :
=regex("Peter Gordon: some@email.com, 47", "^(.+): (.+), (\d+)$", "E-Mail: $2, Name: $1")
결과 : E-Mail: some@email.com, Name: Peter Gordon
단일 셀의 결합 된 문자열을 여러 셀의 구성 요소로 분리하려면 다음을 수행하십시오.
=regex("Peter Gordon: some@email.com, 47", "^(.+): (.+), (\d+)$", "$" & 1)
=regex("Peter Gordon: some@email.com, 47", "^(.+): (.+), (\d+)$", "$" & 2)
결과 : Peter Gordon
some@email.com
…
사용하는 방법
이 UDF를 사용하려면 다음을 수행하십시오 (대략 이 Microsoft 페이지를 기반으로 합니다 . 추가 정보가 있습니다).
- Excel에서 매크로 사용 파일 ( ‘.xlsm’)로 밀어서 Microsoft Visual Basic for Applications Editor
ALT+F11
를 엽니 다 . - 정규식 라이브러리에 VBA 참조를 추가하십시오 ( Portland Runners ++ answer 에서 뻔뻔스럽게 복사 됨 ).
- 도구 -> 참조를 클릭하십시오 (독일 스크린 샷을 실례하십시오)
- 목록에서 Microsoft VBScript Regular Expressions 5.5 를 찾아 옆에있는 확인란을 선택하십시오.
- 확인을 클릭하십시오 .
- 도구 -> 참조를 클릭하십시오 (독일 스크린 샷을 실례하십시오)
-
모듈 삽입을 클릭하십시오 . 모듈에 다른 이름을 지정하면 모듈의 이름이 아래 UDF와 동일 하지 않아야 합니다 (예 : 모듈 이름 지정
Regex
및 기능으로regex
인해 #NAME! 오류가 발생 함). -
가운데의 큰 텍스트 창에 다음을 삽입하십시오.
Function regex(strInput As String, matchPattern As String, Optional ByVal outputPattern As String = "$0") As Variant Dim inputRegexObj As New VBScript_RegExp_55.RegExp, outputRegexObj As New VBScript_RegExp_55.RegExp, outReplaceRegexObj As New VBScript_RegExp_55.RegExp Dim inputMatches As Object, replaceMatches As Object, replaceMatch As Object Dim replaceNumber As Integer With inputRegexObj .Global = True .MultiLine = True .IgnoreCase = False .Pattern = matchPattern End With With outputRegexObj .Global = True .MultiLine = True .IgnoreCase = False .Pattern = "\$(\d+)" End With With outReplaceRegexObj .Global = True .MultiLine = True .IgnoreCase = False End With Set inputMatches = inputRegexObj.Execute(strInput) If inputMatches.Count = 0 Then regex = False Else Set replaceMatches = outputRegexObj.Execute(outputPattern) For Each replaceMatch In replaceMatches replaceNumber = replaceMatch.SubMatches(0) outReplaceRegexObj.Pattern = "\$" & replaceNumber If replaceNumber = 0 Then outputPattern = outReplaceRegexObj.Replace(outputPattern, inputMatches(0).Value) Else If replaceNumber > inputMatches(0).SubMatches.Count Then 'regex = "A to high $ tag found. Largest allowed is $" & inputMatches(0).SubMatches.Count & "." regex = CVErr(xlErrValue) Exit Function Else outputPattern = outReplaceRegexObj.Replace(outputPattern, inputMatches(0).SubMatches(replaceNumber - 1)) End If End If Next regex = outputPattern End If End Function
-
Microsoft Visual Basic for Applications Editor 창 을 저장하고 닫습니다 .
답변
서두르는 사람들을 위해 patszim 의 답변 을 확장하십시오 .
- Excel 통합 문서를 엽니 다.
- Alt+ F11VBA / 매크로 창을 열려면
- 아래 정규식에 대한 참조를 추가 도구 다음 참조
- 및 Microsoft VBScript Regular Expression 5.5 선택
- 새 모듈을 삽입하십시오 (코드는 모듈에 상주해야하며 그렇지 않으면 작동하지 않습니다).
- 새로 삽입 된 모듈에서
-
다음 코드를 추가하십시오.
Function RegxFunc(strInput As String, regexPattern As String) As String Dim regEx As New RegExp With regEx .Global = True .MultiLine = True .IgnoreCase = False .pattern = regexPattern End With If regEx.Test(strInput) Then Set matches = regEx.Execute(strInput) RegxFunc = matches(0).Value Else RegxFunc = "not matched" End If End Function
-
정규식 패턴은 셀 중 하나에 배치되고 절대 참조 가 사용됩니다.
함수는 만든 통합 문서에 연결됩니다.
다른 통합 문서에서 사용해야하는 경우 Personal.XLSB에 함수를 저장하십시오.
답변
내 시도는 다음과 같습니다.
Function RegParse(ByVal pattern As String, ByVal html As String)
Dim regex As RegExp
Set regex = New RegExp
With regex
.IgnoreCase = True 'ignoring cases while regex engine performs the search.
.pattern = pattern 'declaring regex pattern.
.Global = False 'restricting regex to find only first match.
If .Test(html) Then 'Testing if the pattern matches or not
mStr = .Execute(html)(0) '.Execute(html)(0) will provide the String which matches with Regex
RegParse = .Replace(mStr, "$1") '.Replace function will replace the String with whatever is in the first set of braces - $1.
Else
RegParse = "#N/A"
End If
End With
End Function
답변
이것을 셀 함수 ( SUM
또는 같은 VLOOKUP
) 로 사용해야하고 다음과 같은 것이 쉽다는 것을 알았습니다.
- 매크로 사용 Excel 파일 (xlsm로 저장)에 있는지 확인하십시오.
- 개발자 도구 열기 Alt+F11
- 다른 답변과 마찬가지로 Microsoft VBScript Regular Expressions 5.5 추가
-
통합 문서 또는 자체 모듈에서 다음 함수를 작성하십시오.
Function REGPLACE(myRange As Range, matchPattern As String, outputPattern As String) As Variant Dim regex As New VBScript_RegExp_55.RegExp Dim strInput As String strInput = myRange.Value With regex .Global = True .MultiLine = True .IgnoreCase = False .Pattern = matchPattern End With REGPLACE = regex.Replace(strInput, outputPattern) End Function
-
그런 다음 셀에서 사용할 수 있습니다
=REGPLACE(B1, "(\w) (\d+)", "$1$2")
(예 : “A 243”- “A243”)
답변
이것은 직접적인 대답은 아니지만 고려할 때보다 효율적인 대안을 제공 할 수 있습니다. 즉, Google 스프레드 시트에는 여러 정규식 함수가 내장되어 있어 매우 편리하며 Excel의 일부 기술적 절차를 우회하는 데 도움이됩니다. 분명히 PC에서 Excel을 사용하면 몇 가지 장점이 있지만 대부분의 사용자에게 Google 스프레드 시트는 동일한 경험을 제공하며 이식성과 문서 공유에 몇 가지 이점을 제공 할 수 있습니다.
그들은 제안한다
REGEXEXTRACT : 정규식에 따라 일치하는 하위 문자열을 추출합니다.
REGEXREPLACE : 정규식을 사용하여 텍스트 문자열의 일부를 다른 텍스트 문자열로 바꿉니다.
대체 : 기존 텍스트를 문자열의 새 텍스트로 바꿉니다.
REPLACE : 텍스트 문자열의 일부를 다른 텍스트 문자열로 바꿉니다.
셀에 직접 입력하여 원하는 것을 만들 수 있습니다
=REGEXMATCH(A2, "[0-9]+")
또한 IF 문과 같은 다른 기능과의 조합으로도 잘 작동합니다 .
=IF(REGEXMATCH(E8,"MiB"),REGEXEXTRACT(E8,"\d*\.\d*|\d*")/1000,IF(REGEXMATCH(E8,"GiB"),REGEXEXTRACT(E8,"\d*\.\d*|\d*"),"")
잘하면 이것은 Excel의 VBS 구성 요소에 의해 도발 된 사용자에게 간단한 해결 방법을 제공하기를 바랍니다.
답변
여기 regex_subst()
함수가 있습니다. 예 :
=regex_subst("watermellon", "[aeiou]", "")
---> wtrmlln
=regex_subst("watermellon", "[^aeiou]", "")
---> aeeo
다음은 단순화 된 코드입니다 (어쨌든 나를 위해 더 간단합니다). 위의 예제를 사용하여 적절한 출력 패턴을 작성하는 방법을 알 수 없었습니다.
Function regex_subst( _
strInput As String _
, matchPattern As String _
, Optional ByVal replacePattern As String = "" _
) As Variant
Dim inputRegexObj As New VBScript_RegExp_55.RegExp
With inputRegexObj
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = matchPattern
End With
regex_subst = inputRegexObj.Replace(strInput, replacePattern)
End Function