Er der en ækvivalent af streng-match til regexp?
On februar 17, 2021 by adminJeg vil gerne skrive noget som dette undtagen at sammenligne regionen med en regexp.
(if (string-match (buffer-substring-no-properties (point) (mark)) "foo") (bar))
Er der et ækvivalent med streng-match til regexp, som jeg kan bruge som dette
(if (regexp-match (buffer-substring-no-properties (point) (mark)) "^[A-Z]") (bar))
, så det returnerer sandt, hvis den valgte region er “Æble” og ingen, hvis det er “æble”?
Kommentarer
- Et par tilfældige bemærkninger: (i)
string-match
bruger allerede regexps (ii) let-bindcase-fold-search
til nul omkring dit opkald, hvis du vil have store og små bogstaver (iii) bruglooking-at
for at matche tekst i punkt (iv) kan du brugeregion-beginning
ogregion-end
i stedet forpoint
ogmark
hvis sidstnævnte er før førstnævnte (bonuspoint for at sikre, atuse-region-p
ikke er nul) - @YoungFrom jeg synes, at punkt (i) kvalificerer som et svar.
-
C-h f
ville fortælle dig det.
Svar
Af hensyn til et svar:
string-match
er beregnet til brug med regexps.
(streng-match REGEXP STRING & valgfri START)
Returindeks for start af første kamp for REGEXP i STRING eller nul. Matching ignorerer store og små bogstaver, hvis case-fold-search ikke er nul. Hvis tredje argument START ikke er nul, skal du starte søgningen ved dette indeks i STRING. For indeks over første tegn ud over kampen skal du gøre (match-end 0). match-end og match-begyndelse giver også indeks for understrenge matchet med parentesekonstruktioner i mønsteret.
Du kan bruge funktionen match-streng til at udtrække de understregninger, der matches med parentesekonstruktionerne i REGEXP.
Her er nogle eksempler
(string-match "\\(dog\\|cat\\)" "There is a dog.") ;; => 11 (string-match "\\(dog\\|cat\\)" "There are two cats here." 0) ;; => 14 (string-match "\\(dog\\|cat\\)" "There are two cats here." 15) ;; => nil (string-match "\\(dog\\|cat\\)" "There are horses.") ;; => nil
Bemærk, at hvis du ikke planlægger at bruge match-data
efter at have brugt string-match
, skal du foretrækker at bruge string-match-p
som fungerer ligesom string-match
bortset fra at det ikke ændrer match-data
når det køres.
Som andre har sagt, ville looking-at
sandsynligvis være et bedre valg i dit tilfælde.
(ser på REGEXP)
Returner t hvis tekst efter punkt matcher REGEXP med regulært udtryk. Denne funktion ændrer de matchdata, der har match-start, match-end og match-data adgang; gem og gendan matchdata, hvis du vil bevare dem.
string-match
.