2014-04-24 2 views
6

Schauen wir uns das folgende Beispiel an.Wie bekomme ich Gruppentreffer von regulären Ausdrücken in CMake?

set(TEXT "ab,cc,df,gg") 
string(REGEX MATCHALL "((.)\\2)" RESULT "${TEXT}") 
message("Result: ${RESULT}") 

# Expected: Result: cc;gg 
# Actual: Result: 

Vergleichen Sie das erwartete Ergebnis auf regex101.

Kann jemand Match Group 1 im obigen Beispiel korrekt abrufen? Ist das überhaupt möglich mit CMake?

Ich konnte nicht viel über die Einschränkungen des regulären Expression-Prozessors finden, der von CMake im Web verwendet wird. Wer weiß mehr? (Es gibt ein wenig etwas darüber in CMake FAQ geschrieben)

Vielen Dank für die Unterstützung!

Antwort

3

CMakes reguläre Ausdrücke sind relativ begrenzt. Schauen Sie sich die static char* regatom (int *flagp) Methode in RegularExpression.cxx. A \\ zeigt an, daß das nächste Zeichen wird entkommen (behandelt buchstäblich). Es sieht so aus, als ob in der CMake-Regex keine Rückverweise möglich sind.

Als Umgehung können Sie Shell-Befehle mit execute_process aufrufen.

set(TEXT "ab,cc,df,gg") 
message("TEXT: ${TEXT}") 

execute_process(
    COMMAND echo ${TEXT} 
    COMMAND sed "s/.*\\(\\(.\\)\\2\\).*/\\1/g" 
    OUTPUT_VARIABLE RESULT OUTPUT_STRIP_TRAILING_WHITESPACE 
    ) 

message("RESULT: ${RESULT}") 

Dies erzeugt:

TEXT: ab,cc,df,gg 
RESULT: gg 

Sie müssen Ihre regex anzupassen produzieren cc;gg aus der angegebenen Zeichenfolge.

+0

Dies ist jedoch nicht tragbar Fenster zum Beispiel – Joakim

Verwandte Themen