Как получить поддержку регулярных выражений в Excel с помощью функции или пользовательской функции?

19

Похоже, что регулярное выражение (как в регулярных выражениях) не поддерживается в excel, кроме как через VBA. Это так, и если это так, есть ли какие-либо пользовательские функции VBA с открытым исходным кодом, которые поддерживают регулярное выражение. В этом случае я хочу извлечь сложный шаблон внутри строки, но любая реализация пользовательской функции VBA, которая обеспечивает поддержку регулярного выражения внутри самой функции, будет полезна. Если вы знаете о полусвязной функции, такой как IS, чувствуйте, что хотите комментировать, хотя я действительно ищу полный регулярный которая реализуется через функции. Можете даже быть открытым для оплаты использования надстройки, если реализация хорошая.

Также, только хэдз-ап, что я использую Office 2010 в Windows 7; добавила эту информацию после ответа, который, как представляется, является отличным предложением, не работающим в Office 2010.

Если у вас есть вопросы, прокомментируйте.

  • 0
    Другой пользователь (@ user500414) отправил ramblings.mcpher.com/Home/excelquirks/regular-expressions в ответ, но он был удален в качестве комментария, это не плохая реализация с полным кодом общего интерфейса регулярных выражений VBA.
  • 0
    Существует также надстройка, написанная на C ++, так что есть файл .xll для установки, но код доступен: xllregex.codeplex.com
Теги:
excel

6 ответов

28
Лучший ответ

Ничего не встроено в 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
  • 0
    +1 Отлично, спасибо - просто быстрый вопрос, прежде чем я попытаюсь использовать код (который выглядит супер, спасибо) - на какой системе вы это использовали? Я нахожусь на Windows 7, Office 2010 с использованием 64-разрядной. Еще раз спасибо!
  • 0
    Windows 7 64-битная, Office XP. Объект vbscript.regexp поставляется с окнами, а не с офисом, поэтому он должен нормально работать для вас.
Показать ещё 3 комментария
9

Вот сообщение об использовании Regex в Excel:

http://mathfest.blogspot.com/2010/03/regular-expressions-in-excel.html

Надеюсь, что это поможет.

И еще один, который использует Python и IronSpread

http://mathfest.blogspot.ca/2012/06/using-ironspread-and-regular.html

  • 1
    +1 Спасибо, похоже, что это совместимо только с Excel 95 до 2007 - я использую 2010 на Win7; мог бы подумать, что любое решение будет работать на моей платформе, но не думаю, что Я добавлю эту информацию к моему вопросу.
  • 2
    Просто обновление о том, что проблема связана с 64-разрядной версией Office2010 -Win7. Mrexcel.com/forum/showthread.php?t=467397. На данный момент действительно не хочется переходить на 32-разрядную версию Office 2010 только для этой цели. , но подумал, что я добавлю эту информацию в ваш ответ на случай, если кто-то еще изучит ее.
7

Использование regexp внутри функций включено в OpenOffice/LibreOffice Calc. Для активации перейдите в меню "Инструменты" > "Параметры" > "Calc" > "Calulate": Y = "Включить регулярные выражения в формулах". Я использовал это много раз.

2

Я пробовал пару решений и, учитывая мой недостаток опыта в VBA, я обнаружил, что большинство из них слишком громоздки для меня. Самый простой из них был SeoTools для Excel (http://nielsbosma.se/projects/seotools/). Работала как прелесть для меня.

  • 1
    Да, этот инструмент действительно потрясающий;)
1

--- FEB 2014 ---

Просто, чтобы дать альтернативу, Open Office и Libre Office Программное обеспечение Calc (их имя программного обеспечения для электронных таблиц) позволяет использовать регулярные выражения в своих функциях поиска.

  • 0
    Непонятно, почему ваш ответ по теме или почему «FEB 2014» в вашем ответе. Пожалуйста, объясните, спасибо.
  • 2
    Как говорится в моем ответе, это обновленная альтернатива, а не функциональность, которая была заявлена и принята четыре года назад. Я выделяю месяц и год для человека, который прокручивает ответы и не должен искать, сколько лет ответу.
0

Недавно у меня был такой же точный вопрос, и после борьбы с созданием моих собственных инструментов и правильной их работой я нашел отличную онлайн-версию ADDIN, которая очень ЛЕГКО ИСПОЛЬЗОВАТЬ.

Это выдержка автора

За свою стажировку за последние несколько месяцев я работал в Отдел маркетинга и часть моей работы данных в MS Access и генерации отчетов. Это предполагает получение списки перспектив из разных источников данных. Обычно это было довольно простой подвиг, включающий некоторые базовые SQL-запросы. Однако, иногда мне передавали данные, такие как адреса, которые не соответствовали каким-либо стандартный формат, используемый ИТ. В худшем случае данные были представлены в pdf, что означало, что я мог только экспортировать его в текстовый файл без разделителей. Я обнаружил, что мне действительно нужна пара общих регулярных выражений функции для анализа полей для импорта в MS Access. Я нашел несколько .xla примеры в Интернете, но я действительно хотел, чтобы было проще в использовании, больше обширную и портативную библиотеку. Я также хотел включить несколько основных шаблоны, поэтому не нужно было каждый раз изобретать колесо.

Итак, я создал простую надстройку Excel Add-In Regular Expressions.xla, которая добавляет несколько пользовательских функций для стандартного стандартного VBScript выражения.

Вот веб-сайт

Я успешно использовал его для извлечения полезного текста с помощью regex.

  • 0
    добавил код, чтобы он выглядел не так, как реклама, чтобы вы могли видеть, что это полезная и быстрая библиотека

Ещё вопросы

Сообщество Overcoder
Наверх
Меню