Jak używać tekstu z przechwytywania grup w wyrażeniach regularnych Dokumentów Google?

12

Próbuję dopasować określony tekst, a następnie zastąpić tekstem i kilkoma dodatkowymi znakami. Minimalny przykładowy tekst:

#10 Oranges. These are citrus fruits

Pożądane wyjście:

#10 Oranges. These are citrus fruits

Regex: (#\d{1,2}[^.]*\.)\s*

Zamienić: $1\n

( Match using regular expressionsSprawdziłem)

Wyrażenie regularne pomyślnie pasuje #10 Oranges.. Jednak numerowane odniesienie wsteczne nie zastępuje tekstu grupą przechwytującą, ale po prostu wchodzi dosłownie (dosłowne dane wyjściowe są $1\n). Próbowałem także użyć odwrotnego ukośnika dla numerowanego odsyłacza wstecznego \1i wynik jest taki sam.

Czy czegoś brakuje? Jak wstawić ponownie dopasowany tekst do dokumentów Google przy użyciu wyrażeń regularnych?

Użytkownik
źródło
2
Dokumenty teraz wyraźnie stwierdzają: Note: Capture groups only work with Google Sheets.Zobacz support.google.com/docs/answer/62754#regular_expressions
Użytkownik

Odpowiedzi:

4

Krótka odpowiedź

Zamiast korzystać z wbudowanej funkcji znajdowania i zamieniania, użyj Google Apps Script lub dodatku.

Wyjaśnienie

W funkcji Znajdź i zamień w Dokumentach Google część Zamień nie działa z wyrażeniami regularnymi i nie działa ani z replaceText()metodą z usługi Dokumenty w Google Apps Script, na szczęście metoda zamiany JavaScript działa.

Aby poznać podstawy tworzenia prostego skryptu, zobacz https://developers.google.com/apps-script/overview

Kod

Ten kod jest adaptacją kodu zawartego w odnośniku

function myFunction() {
  var body = DocumentApp.getActiveDocument().getBody();
  var paragraphs = body.getParagraphs();
  for (var i=0; i<paragraphs.length; i++) {
    var text = paragraphs[i].getText();
    paragraphs[i].replaceText(".*", 
       text.replace(/(\d{1,2}[^.]*\.)\s*/gi, '$1\n') );
  }
}

Bibliografia

Ruben
źródło
3
Zastanowię się nad tym, ale czy fakt, że zamiana nie działa z regex, jest błędem? Zgodnie z tą dokumentacją wygląda na to, że powinna działać: support.google.com/docs/answer/62754#regular_expressions (patrz sekcja Replace with regular expressions)
Użytkownik
2

Trochę hacky, ale nie wymaga dodatkowego skryptu i prawdopodobnie obejmie 99% twoich przypadków użycia. Nadal możesz używać grup przechwytywania z RegexReplaceodniesieniami w tekście zastępującym za pomocą $1lub $2. Po prostu podziel regex na dwie grupy przechwytywania i połącz z przypadkową (rzadko używaną) postacią, taką jak ~. Następnie możesz pobrać całą zwróconą wartość i zastąpić ~ją nową linią:

=SUBSTITUTE(REGEXREPLACE(A1,"(#\d{1,2}[^.]*\.)(\s*)","$1~$2"),"~",CHAR(10))

zrzut ekranu

Aby uzyskać więcej informacji na temat składni wyrażenia regularnego używanego w arkuszach google, zobacz specyfikację re2

KyleMit
źródło
pytanie dotyczy Dokumentów, a nie Arkuszy, o ile rozumiem.
törzsmókus