help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Possible to write 'beginning of line' in a String?


From: Pascal J. Bourguignon
Subject: Re: Possible to write 'beginning of line' in a String?
Date: Tue, 02 Apr 2013 23:27:59 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.2 (gnu/linux)

Thorsten Jolitz <tjolitz@gmail.com> writes:

> Andreas Röhler <andreas.roehler@easy-emacs.de> writes:
>
>> Am 02.04.2013 11:24, schrieb Óscar Fuentes:
>>> (beginning-of-line)
>>> (insert "abc")
>>
>> resp.
>>
>> (progn (beginning-of-line)
>>        (looking-at "abc")
>
>
> Thats not what I mean. I set a variable with string values that are
> inserted by other libraries (not under my control), but I want to use
> these string values for regexp searches in my own program too. 

No.

Regular expressions are different from the string they match in
general.  

Literal regular expressions are of course identical to the string they
match. (string-match "abc" "abc") --> 0 ; is true

Some special cases may also be identical.  For example, "[][*]*" matches
itself.  (string-match "[][*]*" "[][*]*") --> 0

But not in general, and not in the case of matching the beginning of the
line, since this matches 0 characters, but a position, while obviously
the regular expression for it is 1 or more characters.

One easy solution is to duplicate your variables:

    (defvar *thingy-string* "hello")
    (defvar *thingy-regexp* "\\`hello")


Another solution would be to write a function that would generate from a
regular expression a minimal string that would match.  But in general,
that would be you'd have to re-implement the full regexp parser, since
AFAIK, emacs doesn't have a public API to map regexp strings to regexp
sexps that can easily be processed.


Notice the difference between ^ which means beginning of string, and \\`
which means beginning of line:

    (string-match "^hello" "hello") --> 0
    (string-match "\\`hello" "hello") --> 0

    (string-match "^world" "hello\nworld") --> 6
    (string-match "\\`world" "hello\nworld") --> nil



> But thanks to everyone, I was probably looking for an (obscure magic)
> non-printable control-character that functions in a string like "^" does
> in a regexp, but the way to handle this is probably 'take the string and
> add "^" in front of it before using it as regexp'.

There's no such thing as a control-character.  There are characters.
And there are encodings, which map characters to codes.  Then in a given
encoding, there may be codes that don't correspond to any characters
that may be used to "control" or some other purpose, that one could call
control codes.

Don't let emacs confuse you by the fact that it uses integers to
represent characters.  It still decode and encode them to sequences of
code when doing I/O.

-- 
__Pascal Bourguignon__                     http://www.informatimago.com/
A bad day in () is better than a good day in {}.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]