[squeak-dev] Regular Expressions

Levente Uzonyi leves at caesar.elte.hu
Fri Nov 18 19:14:43 UTC 2016


On Fri, 18 Nov 2016, Edgar De Cleene wrote:

> Very thanks.I use VB-Regex-damienpollet.17.mcz
> By the way, i use Nissus Writer Pro when need learn regex.
> The ripping HTML tags expression is '(?:</?[0-9A-Za-z]+.*?>)’ which of course is not possible in Squeak.

That regular expression has an equivalent form in Squeak:

regex := '</?[0-9A-Za-z]+[^>]*>' asRegex.
html := '<a>foo<b>bar</b></a>'.
regex copy: html replacingMatchesWith: ''

But it is not possible to filter out tags and only tags from html with 
regular expressions.

*?, +? and (?:) are not supported by VBRegex (nor the forked Regex 
package), but I think it wouldn't be too hard to implement them.


Levente

> 
> 
>
>       On Nov 18, 2016, at 11:05, Hans-Martin Mosner <hmm at heeg.de> wrote:
> 
> I was going to write this:
>
>       The "+" already means "match one or more of the previous", where "previous" in this case is ".", which means "any character".
>
>       The "?" means "match zero or one of the previous", but it cannot be cmobined with "+".
> 
> But then I realized that "+?" is defined in regex syntax as "lazy" matching, i.e. it finds as few of the previous tokens as needed to to make the pattern match (in contrast, standard "+" matches
> greedily, so it consumes as much as possible while still matching the pattern).
> 
> However, the Rx framework in Squeak is quite old and does not have these extensions. A pattern that should work would be "<[^>]+>" which matches an opening angle bracket, any characters that are not
> closing angle brackets, and finally the closing bracket.
> 
> Be aware though that correctly stripping tags from HTML is not possible (or at least not trivial) with regex. For example, in your pattern, the "." would not match newlines, but tags can extend over
> multiple lines, so you would not be able to strip out a multiline tag. My pattern apparently works with newlines, too, but there are other cases that it does not handle (for example,
> seehttp://stackoverflow.com/questions/94528/is-u003e-greater-than-sign-allowed-inside-an-html-element-attribute-value).
> 
> So unless you know that your input is going to be fairly regular, don't rely on regex to strip tags. Use a proper HTML/SGML/XML parser, they are designed to do it right.
> 
> Cheers,
> 
> Hans-Martin
> 
> 
> 
>


More information about the Squeak-dev mailing list