Я хочу использовать функцию поиска и замены в Excel, чтобы удалить примеры предложений из ячеек, подобных этой:

text <br>〔「text」text,「text」text〕<br>(1)text「sentence―sentence/sentence」<br>(2)text「sentence―sentence」

Предложения заключены в 「」 скобки и будут содержать символ - и / где-то внутри скобок.
Я пытался 「*―*/*」, однако это удалит все справа от 〔
Есть ли способ нацелить и удалить эти конкретные скобки предложений с помощью инструмента поиска и замены?

Желаемый результат:

text <br>〔「text」text,「text」text〕<br>(1)text<br>(2)text「sentence―sentence」
1
asd213e1 19 Июл 2020 в 05:44

4 ответа

Лучший ответ

Довольно длинная формула, но в Excel O365 вы можете использовать:

=SUBSTITUTE(CONCAT(FILTERXML("<t><s>"&SUBSTITUTE(CONCAT(IF(MID(A1,SEQUENCE(LEN(A1)),1)="「","</s><s>「",IF(MID(A1,SEQUENCE(LEN(A1)),1)="」","」</s><s>",MID(A1,SEQUENCE(LEN(A1)),1)))),"<br>","|$|")&"</s></t>","//s[not(contains(., '「') and contains(., '―') and contains(., '/') and contains(., '」'))][node()]")),"|$|","<br>")

Пока у вас есть доступ к CONCAT, вы также можете делать это в Excel 2019, но вам придется поменять SEQUENCE(LEN(A1)) на ROW(A$1:INDEX(A:A,LEN(A1)))

enter image description here

1
JvdV 19 Июл 2020 в 07:35

Вы не пометили тегом [VBA] , но если вы не против, вы можете написать пользовательскую функцию, которая будет делать то, что вы хотите, используя регулярные выражения.

Для ввода этой пользовательской функции (UDF) alt-F11 открывает редактор Visual Basic. Убедитесь, что ваш проект выделен в окне Project Explorer. Затем в верхнем меню выберите Insert/Module и вставьте приведенный ниже код в открывшееся окно.

Чтобы использовать эту пользовательскую функцию (UDF), введите формулу типа =replStr(A1) в какую-либо ячейку.

Option Explicit
Function replStr(str As String) As String
    Dim RE As Object
    Const sPat As String = "\u300C(?:(?=[^\u300D]*\u002F)(?=[^\u300D]*\u2015)[^\u300D]*)\u300D"
    
Set RE = CreateObject("vbscript.regexp")
With RE
    .Global = True
    .Pattern = sPat
    replStr = .Replace(str, "")
End With
End Function

enter image description here

0
Ron Rosenfeld 19 Июл 2020 в 14:44

Эта формула не будет работать во многих случаях, но если строка имеет соответствующие правила, как в вашем примере, попробуйте это:

=SUBSTITUTE(C5,"「" & INDEX(TRIM(MID(SUBSTITUTE(","&SUBSTITUTE(C5,"」","「"),"「",REPT(" ",99)),(ROW(A1:INDEX(A1:A100,LEN(C5)-LEN(SUBSTITUTE(C5,"」",""))))*2-1)*99,99)),MATCH("*―*/*",TRIM(MID(SUBSTITUTE(","&SUBSTITUTE(C5,"」","「"),"「",REPT(" ",99)),(ROW(A1:INDEX(A1:A100,LEN(C5)-LEN(SUBSTITUTE(C5,"」",""))))*2-1)*99,99)),0)) & "」","")

enter image description here

Объясните, как это работает:

  1. разбить строку между символами "「 "and "」" в массив
  2. используйте match("*―*/*",,0), чтобы найти позицию строки (обратите внимание, что она вернет только одно значение, если оно существует, если у вас есть несколько строк, вы можете заменить match("*―*/*",) на search ("*―*/*",..) и использовать его в качестве дополнительного столбец для получения совпадений строки)
  3. Используйте index(array,match("*―*/*",..)), чтобы получить строку, которую нужно заменить (результат)
  4. Заменить исходную строку найденными результатами =substitute(txt,result,"")
0
Dang D. Khanh 19 Июл 2020 в 04:40

Или,

В B1 введите формулу:

=SUBSTITUTE(A1,"「"&TRIM(RIGHT(SUBSTITUTE(LEFT(A1,FIND("」",A1,FIND("/",A1))),"「",REPT(" ",99)),99)),"")

enter image description here

0
bosco_yip 19 Июл 2020 в 06:23