der folgende Code Gegeben:Power regex Problem mit Power 2 vs. Power 5 Zeilenende Anker
$inputString = "`r`n#cmakedefine BREAK_THE_CODE`r`n"
$match = '(?m)^(.*?)#cmakedefine(.*?)$'
$replace = 'hello $1#undef$2 goodbye '
$retVal = $inputString -replace $match,$replace -join "`r`n"
Write-Host $retVal
Powershell 5 erzeugt den folgenden (erwarteten) Ausgang:
hello #undef BREAK_THE_CODE goodbye
2 erzeugt die Powershell folgende (unerwartete) Ausgabe:
goodbye def BREAK_THE_CODE
Wer weiß warum? Oder habe einen Workaround. Mir geht es gut mit [Regex ::], wenn es mir mehr Konsistenz kauft. Ich brauche beide Versionen, um die gleichen Ergebnisse zu erzielen. Für das, was es wert ist, werden Hallo und Auf Wiedersehen am Ende /*
und */
sein, aber ich versuche zu vermeiden, das Problem mit irgendetwas zu verwechseln, das als ein Sonderzeichen interpretiert werden könnte.
EDIT: Matts Antwort unten ist Detaillierung, dass beide Versionen Powershell die gleiche Leistung produzieren, [CR][LF]hello #undef BREAK_THE_CODE[CR] goodbye [LF]
und den scheinbaren Unterschied zwischen den Versionen ist eigentlich ISE vs. nicht ISE und Write-Host
. Das Hauptproblem ist hier, dass meine Regex gerade gebrochen wurde, obwohl ich immer noch nicht weiß, warum das so ist.
Ich landete mit:
$match = "(?m)^(.*?)#cmakedefine([^\r\n]*)"
$replace = '/* $1#undef$2 */'
Als kleine Seitenleiste, die Hilfe für den VS 2015 IDE (die fast auf jeden Fall das gleiche Regex-Engine verwendet) listet \r?$
als das eigentliche Ende der Zeile Ankers: https://msdn.microsoft.com/en-us/library/2k3te2cs.aspx
Dieser Anker könnte gemacht werden, indem er den \r
Teil von ihm fängt, den ich anfänglich tat, aber ich bevorzugte Wiktors Lösung unten.
Sie können erheblich verbessern '(. *?) (\ 'r?)' - siehe meine Antwort wie. –