2017-01-04 34 views
2

I erfassen müssen (ersetzen) zuerst 20 Auftreten von Stellen (vor dem Komma) in der folgenden Zeileersetzen erste 20 Vorkommen

11112222333344445555, 123456 

und Komma zwischen den Ziffern einzufügen. Ich habe versucht, (\d)(\d) ... (\d) 20 mal und ersetzen durch \1,\2, ... \20, aber es ist fehlgeschlagen. Darf ich einen besseren Weg, es mit Notepad zu tun wissen.

+0

Was meinst du mit "es hat versagt"? Angesichts dessen, was Sie gepostet haben, sollte das funktionieren. Das führt mich zu der Annahme, dass etwas falsch repräsentiert ist oder dass Sie nichts gepostet haben. – Travis

+0

@Travis es scheint, dass Notepad ++ nicht unterstützt ersetzen "10" und darüber hinaus. Es ist dasselbe wie '\ 1' +' 0'. –

+0

Interessant. (Ich habe Notepad ++ selbst nicht). Warum drehst du nicht einfach zwei Regexes?(die zweite würde wahrscheinlich anders sein, um die Änderungen nach der ersten Rechnung zu tragen) – Travis

Antwort

2

Ich habe eine Lösung gefunden, die nicht die Gruppen Benennung erfordert:

  • Suche nach (\d)(\d)...(\d)
  • ersetzen durch $1, $2, ... $9, $10, ... $20

Sie können die Backreference-Nummer in geschweifte Klammern einschließen, wenn sie hilft, den Ausdruck zu entschlüsseln: $11 und ${11} beziehen sich beide auf den 11. Ausdruck, während ${1}1 sich auf die erste Rückwärtsreferenz bezieht, gefolgt von dem Zeichen 1.

Die Syntax ist in Notepad++'s documentation beschrieben, aber vorsichtig, nicht zu versuchen, die Suchsyntax (\g{n}) im Ersetzen Feld zu verwenden!

+0

es scheint, müssen Sie nicht umschließen '{}' –

+1

@SantoshLinkha richtig, ich habe dies bearbeitet in. Notepad ++ 's Dokumentation zu diesem Thema wirklich ist glanzlos: - / – Aaron

3

Suche:

(?<a>\d)(?<b>\d)(?<c>\d)(?<d>\d)(?<e>\d)(?<f>\d)(?<g>\d)(?<h>\d)(?<i>\d)(?<j>\d)(?<k>\d)(?<l>\d)(?<m>\d)(?<n>\d)(?<o>\d)(?<p>\d)(?<q>\d)(?<r>\d)(?<s>\d)(?<t>\d) 

ersetzen:

${a},${b},${c},${d},${e},${f},${g},${h},${i},${j},${k},${l},${m},${n},${o},${p},${q},${r},${s},${t} 

proof of concept


Das ist aber alles wird gesagt ... für ähnliche Probleme mit größeren n, ist es wahrscheinlich besser, wenn Sie einen iterativen/programmatischen Ansatz (in der Sprache Ihrer Wahl) verwenden, anstatt einen Single-Shot-Regex-Vorgang zum Suchen/Ersetzen.

Beispiel in Java:

String input = /* some string */; 

Pattern pattern = Pattern.compile("^\\d+"); 
Matcher matcher = pattern.matcher(input); 
String match = matcher.group(); 

StringBuilder sb = new StringBuilder(match.length()*2); 
for (char ch : match.toCharArray()) { 
    sb.append(ch); 
    sb.append(','); 
} 
String replacement = sb.substring(0,sb.length()-1); 

String result = replacement + input.subString(match.length()); 
2

Für Capture-Gruppe mit der Nummer größer als 9 ist, sollten Sie ${10}${11} ...

-Find was: (\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d) -Ersetzen mit: $1,$2,$3,$4,$5,$6,$7,$8,$9,${10},${11},${12},${13},${14},${15},${16},${17},${18},${19},${20}

Aber es ist für größere Anzahl unmaintable, würde ich vorschlagen, Sie zu verwenden:

  • Suchen nach: (?<![ \d])\d(?!,)
  • mit Ersetzen: $0,