Разбор RegEx в Excel

485
gbi1977

Предположим, у меня есть электронная таблица Excel со следующим столбцом:

А-345 привет

Привет B-389

хороший C-6231

что A-12287 кто

просто А-7819, С-45556

Как видите, у меня есть текст, объединенный с некоторыми RegEx, состоит из A, B или C, дефиса и некоторого числа длиной до 5-6 цифр. Некоторые из этих выражений встречаются в некоторых строках более одного раза.

Я хотел бы проанализировать этот RegEx (который несколько варьируется между строками) в другой столбец. Если в какой-то строке есть несколько выражений (например, 5-я строка в моем примере), то я бы хотел разделить их любым символом, который не является дефисом (пробел будет делать это).

Есть ли встроенная функция в Excel, которая позволяет мне это делать? Может быть, какой-нибудь скрипт VBA?

Я нашел эту ветку, но сначала хотел бы узнать, смогу ли я сделать это без каких-либо внешних надстроек или программного обеспечения. Эта конкретная надстройка поддерживает то, что мне нужно?

0
Посмотрите, поможет ли это: https://stackoverflow.com/questions/22542834/how-to-use-regular-expressions-regex-in-microsoft-excel-both-in-cell-and-loops Scott Craner 7 лет назад 1
Каков ваш ожидаемый результат? DavidPostill 7 лет назад 0
@DavidPostill отдельный столбец с регулярным выражением (A-345, B-389 и т. Д.) В каждой строке. если в одной строке есть несколько выражений (например, заданная 5-я строка), то я бы хотел, чтобы все они были в одном столбце, разделены пробелом или запятой. gbi1977 7 лет назад 0

1 ответ на вопрос

1
Scott Craner

Если вы хотите встроенную функцию, вы можете сделать эту формулу массива:

=TEXTJOIN(" ",TRUE,IFERROR(--LEFT(TRIM(MID(SUBSTITUTE(A1,"-",REPT(" ",999)),ROW(INDIRECT("1:" & LEN(A1)-LEN(SUBSTITUTE(A1,"-",""))))*999,999)),FIND(" ",TRIM(MID(SUBSTITUTE(A1,"-",REPT(" ",999)),ROW(INDIRECT("1:" & LEN(A1)-LEN(SUBSTITUTE(A1,"-",""))))*999,999))&" ")-1),"")) 

Будучи формулой массива, она должна быть подтверждена Ctrl-Shift-Enter вместо Enter при выходе из режима редактирования. Если все сделано правильно, тогда Excel обведет {}формулу.

Замечания:

Это вернет первую группу номеров после каждого -

enter image description here


TEXTJOIN () доступен с подпиской на Office 365 Excel. Если у вас его нет, добавьте этот код в модуль, прикрепленный к книге, и используйте формулу, как описано выше:

Function TEXTJOIN(delim As String, skipblank As Boolean, arr) Dim d As Long Dim c As Long Dim arr2() Dim t As Long, y As Long t = -1 y = -1 If TypeName(arr) = "Range" Then arr2 = arr.Value Else arr2 = arr End If On Error Resume Next t = UBound(arr2, 2) y = UBound(arr2, 1) On Error GoTo 0  If t >= 0 And y >= 0 Then For c = LBound(arr2, 1) To UBound(arr2, 1) For d = LBound(arr2, 1) To UBound(arr2, 2) If arr2(c, d) <> "" Or Not skipblank Then TEXTJOIN = TEXTJOIN & arr2(c, d) & delim End If Next d Next c Else For c = LBound(arr2) To UBound(arr2) If arr2(c) <> "" Or Not skipblank Then TEXTJOIN = TEXTJOIN & arr2(c) & delim End If Next c End If TEXTJOIN = Left(TEXTJOIN, Len(TEXTJOIN) - Len(delim)) End Function