함수 또는 커스텀 함수를 통해 Excel에서 regex 지원을 받으려면 어떻게 해야 합니까?
정규 표현과 같은 regex는 VBA를 경유하는 경우를 제외하고 Excel에서는 지원되지 않는 것으로 보입니다.그런가요? 만약 그렇다면 regex를 지원하는 "오픈 소스" 커스텀 VBA 함수가 있나요?이 경우 문자열 내에서 복잡한 패턴을 추출하려고 합니다.또, 함수 자체의 regex 서포트를 나타내는 커스텀 VBA 함수의 실장도 도움이 됩니다.IS 기능 등 반관련 기능에 대해 알고 계신 분은 자유롭게 코멘트해 주십시오.단, 저는 함수에 의해 공개되는 완전한 정규 표현 구현을 정말 찾고 있습니다.
또, Windows 7 에서는 Office 2010 을 사용하고 있는 것을 경고합니다.Office 2010 에서는 동작하지 않는 것이 좋다고 생각되는 회답에 이 정보를 추가했습니다.
Excel에 내장된 것은 없습니다.VBScript에는 지원 기능이 내장되어 있어 VBA에서 호출할 수 있습니다.자세한 내용은 이쪽.VBA에서 레이트바인딩을 사용하여 오브젝트를 호출할 수 있습니다.최근에 조립한 기능을 몇 가지 추가했습니다.테스트 완료가 되어 있지 않고, 버그가 있는 경우도 있습니다만, 매우 간단합니다.
이것으로 적어도 다음을 시작할 수 있습니다.
'---------------------------------------------------------------------------------------vv
' Procedure : RegEx
' Author : Mike
' Date : 9/1/2010
' Purpose : Perform a regular expression search on a string and return the first match
' or the null string if no matches are found.
' Usage : If Len(RegEx("\d{1,2}[/-]\d{1,2}[/-]\d{2,4}", txt)) = 0 Then MsgBox "No date in " & txt
' : TheDate = RegEx("\d{1,2}[/-]\d{1,2}[/-]\d{2,4}", txt)
' : CUSIP = Regex("[A-Za-z0-9]{8}[0-9]",txt)
'---------------------------------------------------------------------------------------
'^^
Function RegEx(Pattern As String, TextToSearch As String) As String 'vv
Dim RE As Object, REMatches As Object
Set RE = CreateObject("vbscript.regexp")
With RE
.MultiLine = False
.Global = False
.IgnoreCase = False
.Pattern = Pattern
End With
Set REMatches = RE.Execute(TextToSearch)
If REMatches.Count > 0 Then
RegEx = REMatches(0)
Else
RegEx = vbNullString
End If
End Function '^^
'---------------------------------------------------------------------------------------
' Procedure : RegExReplace
' Author : Mike
' Date : 11/4/2010
' Purpose : Attempts to replace text in the TextToSearch with text and back references
' from the ReplacePattern for any matches found using SearchPattern.
' Notes - If no matches are found, TextToSearch is returned unaltered. To get
' specific info from a string, use RegExExtract instead.
' Usage : ?RegExReplace("(.*)(\d{3})[\)\s.-](\d{3})[\s.-](\d{4})(.*)", "My phone # is 570.555.1234.", "$1($2)$3-$4$5")
' My phone # is (570)555-1234.
'---------------------------------------------------------------------------------------
'
Function RegExReplace(SearchPattern As String, TextToSearch As String, ReplacePattern As String, _
Optional GlobalReplace As Boolean = True, _
Optional IgnoreCase As Boolean = False, _
Optional MultiLine As Boolean = False) As String
Dim RE As Object
Set RE = CreateObject("vbscript.regexp")
With RE
.MultiLine = MultiLine
.Global = GlobalReplace
.IgnoreCase = IgnoreCase
.Pattern = SearchPattern
End With
RegExReplace = RE.Replace(TextToSearch, ReplacePattern)
End Function
'---------------------------------------------------------------------------------------
' Procedure : RegExExtract
' Author : Mike
' Date : 11/4/2010
' Purpose : Extracts specific information from a string. Returns empty string if not found.
' Usage : ?RegExExtract("(.*)(\d{3})[\)\s.-](\d{3})[\s.-](\d{4})(.*)", "My phone # is 570.555.1234.", "$2$3$4")
' 5705551234
' ?RegExExtract("(.*)(\d{3})[\)\s.-](\d{3})[\s.-](\d{4})(.*)", "My name is Mike.", "$2$3$4")
'
' ?RegExReplace("(.*)(\d{3})[\)\s.-](\d{3})[\s.-](\d{4})(.*)", "My name is Mike.", "$2$3$4")
' My name is Mike.
'---------------------------------------------------------------------------------------
'
Function RegExExtract(SearchPattern As String, TextToSearch As String, PatternToExtract As String, _
Optional GlobalReplace As Boolean = True, _
Optional IgnoreCase As Boolean = False, _
Optional MultiLine As Boolean = False) As String
Dim MatchFound As Boolean
MatchFound = Len(RegEx(SearchPattern, TextToSearch)) > 0
If MatchFound Then
RegExExtract = RegExReplace(SearchPattern, TextToSearch, PatternToExtract, _
GlobalReplace, IgnoreCase, MultiLine)
Else
RegExExtract = vbNullString
End If
End Function
다음은 Excel에서의 Regex 사용에 관한 게시물입니다.
http://mathfest.blogspot.com/2010/03/regular-expressions-in-excel.html
도움이 됐으면 좋겠다.
그리고 Python과 IronSpread를 사용하는 다른 것
http://mathfest.blogspot.ca/2012/06/using-ironspread-and-regular.html
함수 내 regexp 사용은 OpenOffice/LibreOffice Calc에 포함되어 있습니다.활성화하려면 [Tools]> [ Options ]> [ Calc ]> [ Calculate ]으로 이동합니다.Y = 공식에서 정규식을 활성화합니다.
몇 가지 솔루션을 시도했지만 VBA에 대한 전문 지식이 부족하기 때문에 대부분의 솔루션이 너무 번거롭습니다.가장 쉬운 것은 SeoTools for Excel(http://nielsbosma.se/projects/seotools/)입니다.나한테는 마법처럼 작용했어.
--- 2014년 2월 ---
다른 방법으로 Open Office와 Libre Office Calc 소프트웨어(그들의 스프레드시트 소프트웨어 이름)를 사용하면 검색 기능에 정규 표현을 사용할 수 있습니다.
저도 최근에 똑같은 질문을 받았는데, 제가 직접 도구를 만들고 올바르게 작동시키는 데 어려움을 겪었더니 사용하기 쉬운 훌륭한 온라인 ADDIN을 발견했습니다.
이것은 창작자의 발췌본이다.
지난 몇 달 동안의 인턴십 기간 동안 마케팅 과학 부서에서 일했으며, 일부 업무는 MS Access에 데이터를 수집하고 보고서를 생성하는 것이었습니다.여기에는 다양한 데이터 소스에서 잠재 고객 목록을 가져오는 작업이 포함됩니다.이것은 보통 몇 가지 기본적인 SQL 쿼리를 수반하는 매우 간단한 작업입니다.다만, IT부문이 사용하는 표준 형식과 일치하지 않는 주소등의 데이터가 건네지는 일이 있었습니다.최악의 경우 데이터는 pdf로 제공되어 구분되지 않은 텍스트 파일로만 내보낼 수 있었습니다.MS Access로 Import할 필드를 해석하기 위해 몇 가지 일반적인 정규 표현 함수가 필요하다는 것을 알게 되었습니다.온라인으로 .xla의 예를 몇 가지 찾았습니다만, 사용하기 쉽고, 보다 광범위하고, 휴대성이 뛰어난 라이브러리를 정말로 원했습니다.기본적인 패턴도 몇 가지 포함시키고 싶었기 때문에 매번 바퀴를 다시 발명할 필요는 없었습니다.
그래서 간단한 엑셀 애드인 정규 표현을 만들었습니다.xla: 표준 VBScript 정규 표현을 구현하기 위해 몇 가지 커스텀 함수를 추가합니다.
여기 웹사이트가 있습니다.
regex를 사용하여 유용한 텍스트를 추출하는 데 성공했습니다.
애드인의 코드는 다음과 같습니다.
' Regular Expressions.xla
'
' ? 2010 Malcolm Poindexter
' This is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License
' as published by the Free Software Foundation, version 3.
' This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
' without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
' See the GNU General Public License for more details. http://www.gnu.org/licenses/gpl.html
'
' I would appreciate if you would notify me of any modifications or re-distributions of this code at contact@malcolmp.com
' and appropriately attribute me as the original author in the header.
' ------------------------------------------------------------------------------------------------------------------------
'
' This file provides an Excel Add-In containing regular expression processing functions and several pre-defined regular expressions.
' The regular expressions provided are not necessarially exhaustive, but are intended to cover the most common cases.
'
' Regular Expressions Syntax: http://msdn.microsoft.com/en-us/library/1400241x%28VS.85%29.aspx
' -----------------------------
' NAME: xREPLACE
' DESCRIPTION: Replace all portions of the search text matching the pattern with the replacement text.
' -----------------------------
Function xREPLACE(pattern As String, searchText As String, replacementText As String, Optional ignoreCase As Boolean = True) As String
On Error Resume Next
Dim RegEx As New RegExp
RegEx.Global = True
RegEx.MultiLine = True
RegEx.pattern = pattern
RegEx.ignoreCase = ignoreCase
xREPLACE = RegEx.Replace(searchText, replacementText)
End Function
' -----------------------------
' NAME: xMATCHES
' DESCRIPTION: Find and return the number of matches to a pattern in the search text.
' -----------------------------
Function xMATCHES(pattern As String, searchText As String, Optional ignoreCase As Boolean = True) As String
On Error Resume Next
Dim RegEx As New RegExp
RegEx.Global = True
RegEx.MultiLine = True
RegEx.pattern = pattern
RegEx.ignoreCase = ignoreCase
Dim matches As MatchCollection
Set matches = RegEx.Execute(searchText)
xMATCHES = matches.Count
End Function
' -----------------------------
' NAME: xMATCH
' DESCRIPTION: Find and return an instance of a match to the pattern in the search text. MatchIndex may be used in the case of multiple matches.
' -----------------------------
Function xMATCH(pattern As String, searchText As String, Optional matchIndex As Integer = 1, _
Optional ignoreCase As Boolean = True) As String
On Error Resume Next
Dim RegEx As New RegExp
RegEx.Global = True
RegEx.MultiLine = True
RegEx.pattern = pattern
RegEx.ignoreCase = ignoreCase
Dim matches As MatchCollection
Set matches = RegEx.Execute(searchText)
Dim i As Integer
i = 1
For Each Match In matches
If i = matchIndex Then
xMATCH = Match.Value
End If
i = i + 1
Next
End Function
' -----------------------------
' NAME: xMATCHALL
' DESCRIPTION: Find and return a comma-separated list of all matches to the pattern in the search text.
' -----------------------------
Function xMATCHALL(pattern As String, searchText As String, Optional ignoreCase As Boolean = True) As String
On Error Resume Next
Dim RegEx As New RegExp
RegEx.Global = True
RegEx.MultiLine = True
RegEx.pattern = pattern
RegEx.ignoreCase = ignoreCase
Dim matches As MatchCollection
Set matches = RegEx.Execute(searchText)
Dim i As Integer
i = 1
Dim returnMatches As String
returnMatches = ""
For Each Match In matches
If i = 1 Then
returnMatches = Match.Value
Else
returnMatches = returnMatches + "," + Match.Value
End If
i = i + 1
Next
xMATCHALL = returnMatches
End Function
' -----------------------------
' NAME: xGROUP
' DESCRIPTION: Find and return a group from within a matched pattern.
' -----------------------------
Function xGROUP(pattern As String, searchText As String, group As Integer, Optional matchIndex As Integer = 1, _
Optional ignoreCase As Boolean = True) As String
On Error Resume Next
If group <> 0 Then
group = group - 1
End If
Dim RegEx As New RegExp
RegEx.Global = True
RegEx.MultiLine = True
RegEx.pattern = pattern
RegEx.ignoreCase = ignoreCase
Dim matches As MatchCollection
Set matches = RegEx.Execute(searchText)
Dim i As Integer
i = 1
For Each Match In matches
If i = matchIndex Then
xGROUP = Match.SubMatches(group)
End If
i = i + 1
Next
End Function
' -----------------------------
' NAME: xSTARTSWITH
' DESCRIPTION: Returns true or false if the search text starts with the pattern.
' -----------------------------
Function xSTARTSWITH(pattern As String, searchText As String, Optional ignoreCase As Boolean = True) As String
On Error Resume Next
Dim RegEx As New RegExp
RegEx.Global = True
RegEx.MultiLine = True
RegEx.pattern = "^" + pattern
RegEx.ignoreCase = ignoreCase
Dim matches As MatchCollection
Set matches = RegEx.Execute(searchText)
xSTARTSWITH = matches.Count > 0
End Function
' -----------------------------
' NAME: xENDSWITH
' DESCRIPTION: Returns true or false if the search text ends with the pattern.
' -----------------------------
Function xENDSWITH(pattern As String, searchText As String, Optional ignoreCase As Boolean = True) As String
On Error Resume Next
Dim RegEx As New RegExp
RegEx.Global = True
RegEx.MultiLine = True
RegEx.pattern = pattern + "$"
RegEx.ignoreCase = ignoreCase
Dim matches As MatchCollection
Set matches = RegEx.Execute(searchText)
xENDSWITH = matches.Count > 0
End Function
' ************************************
' Regular Expression Definitions
' ************************************
' -----------------------------
' NAME: xxEMAIL
' DESCRIPTION: Pattern to match an email address.
' -----------------------------
Function xxEMAIL() As String
xxEMAIL = "\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b"
End Function
' -----------------------------
' NAME: xxUSZIP
' DESCRIPTION: Pattern to match an US Zip code.
' -----------------------------
Function xxUSZIP() As String
xxUSZIP = "\b(?!0{5})(\d{5})(?!-0{4})(-\d{4})?\b"
End Function
' -----------------------------
' NAME: xxPHONE
' DESCRIPTION: Pattern to match a phone number.
' -----------------------------
Function xxPHONE() As String
xxPHONE = "\b[01]?[- .]?\(?[2-9]\d{2}\)?\s?[- .]?\s?\d{3}\s?[- .]?\s?\d{4}(\s*(x|(ext))[\.]?\s*\d{1,6})?\b"
End Function
' -----------------------------
' NAME: xxURL
' DESCRIPTION: Pattern to match a url.
' -----------------------------
Function xxURL() As String
xxURL = "\b((ftp)|(https?))\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}\b"
End Function
' ************************************
' Insert Function Dialog Category Setup
' ************************************
Sub AddCategoryDescription()
Application.MacroOptions Macro:="xREPLACE", _
Description:="Replace all portions of the search text matching the pattern with the replacement text.", _
Category:="Regular Expressions"
Application.MacroOptions Macro:="xMATCHES", _
Description:="Find and return the number of matches to a pattern in the search text.", _
Category:="Regular Expressions"
Application.MacroOptions Macro:="xMATCH", _
Description:="Find and return an instance of a match to the pattern in the search text. MatchIndex may be used in the case of multiple matches.", _
Category:="Regular Expressions"
Application.MacroOptions Macro:="xMATCHALL", _
Description:="Find and return a comma-separated list of all matches to the pattern in the search text.", _
Category:="Regular Expressions"
Application.MacroOptions Macro:="xGROUP", _
Description:="Find and return a group from within a matched pattern.", _
Category:="Regular Expressions"
Application.MacroOptions Macro:="xSTARTSWITH", _
Description:="Returns true or false if the search text starts with the pattern.", _
Category:="Regular Expressions"
Application.MacroOptions Macro:="xENDSWITH", _
Description:="Returns true or false if the search text ends with the pattern.", _
Category:="Regular Expressions"
'**** Regular Expressions ****
Application.MacroOptions Macro:="xxEMAIL", _
Description:="Pattern to match an email address.", _
Category:="Regular Expressions"
Application.MacroOptions Macro:="xxUSZIP", _
Description:="Pattern to match an US Zip code.", _
Category:="Regular Expressions"
Application.MacroOptions Macro:="xxPHONE", _
Description:="Pattern to match a phone number.", _
Category:="Regular Expressions"
Application.MacroOptions Macro:="xxURL", _
Description:="Pattern to match a url.", _
Category:="Regular Expressions"
End Sub
언급URL : https://stackoverflow.com/questions/4556910/how-do-i-get-regex-support-in-excel-via-a-function-or-custom-function
'code' 카테고리의 다른 글
UIButton 글꼴 크기를 너비에 맞게 조정 (0) | 2023.04.18 |
---|---|
DataTable을 Excel로 내보내는 방법 (0) | 2023.04.18 |
Swift에서 첫 번째 ViewController에서 탐색 모음을 숨기려면 어떻게 해야 합니까? (0) | 2023.04.18 |
Git에서 파일 이동/이름 변경 및 이력 유지가 가능합니까? (0) | 2023.04.18 |
Excel 파일(.xlsx)을 작성 및 쓰는 방법 (0) | 2023.04.18 |