• Skip to main content
  • Skip to search
  • Skip to footer
Cadence Home
  • This search text may be transcribed, used, stored, or accessed by our third-party service providers per our Cookie Policy and Privacy Policy.

  1. Community Forums
  2. Custom IC SKILL
  3. Regular Expression: detecting 2 or more consecutive spaces...

Stats

  • Locked Locked
  • Replies 7
  • Subscribers 143
  • Views 24813
  • Members are here 0
This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Regular Expression: detecting 2 or more consecutive spaces oddity

Sheppy
Sheppy over 9 years ago

Hi,

For a particular script I have to check whether or not a string has two or more consecutive spaces between lower-case characters. Zero and one space are allowed, two or more not. I am using rexMatchp() to check. Please have a look at the following code+output:

rexMatchp("[a-z][ ]{2,}[a-z]" "test test")

nil

rexMatchp("[a-z][ ]{2,}[a-z]" "test  test")

nil

rexMatchp("[a-z][ ]{2,}[a-z]" "test   test")

nil

rexMatchp("[a-z][ ][ ]+[a-z]" "test test")

nil

rexMatchp("[a-z][ ][ ]+[a-z]" "test  test")

t

rexMatchp("[a-z][ ][ ]+[a-z]" "test   test")

t

The three last commands do exactly what I want. However, the first three do not work, although this is perfectly legal syntax for a regular expression. I found in the Virtuoso documentation that using {} to specify the number of occurrences is supported, but it clearly doesn't work in my example.

Am I doing something wrong?

With kind regards,

Sjoerd

  • Cancel
Parents
  • Andrew Beckett
    Andrew Beckett over 9 years ago

    Hi Sjoerd,

    Was a bit difficult to see the wood from the trees in all of this - but the key problem is the "-" character in the pattern. The trouble is that this is being interpreted as a "range" separator - in fact pcreCompile gives a warning to that respect.

    So if you do this:

    pattern = "[`\\-=;'./~!@$%^&*()_+{}|:\"<>?\\[\\]]"
    ;pattern = "\\S"
    testString = "`-=;'./~!@$%^&*()_+{}|:\"<>?[]"
    pat=pcreCompile(pattern)
    for( i 1 strlen( testString )
      printf( "%L - %L\n" substring( testString i 1 ) pcreExecute(pat substring( testString i 1 ) ) )
    )

    You'll see it works (notice the double backslash before the - in the expression - you can do the same in your main code of course). It's a double backslash, because SKILL also uses backslash to escape characters in strings, and backslash is an escape character in regular expressions, so to get an RE \ you need \\. I also answered the bonus question of how to add [] inside the [] - escape them (see the end of the pattern).

    Note you could also use \\S (see "man perlre" for info on Perl regular expressions) but maybe you want to exclude particular characters - you could use other complex ranges though maybe to make it simpler.

    In order to detect a non-carriage-return terminated line, I just added this to your code:

    printf("READ %L NEWLINE %L\n" nextLine pcreMatchp("\n" nextLine))

    The pcreMatchp would return nil for the last line in the file if it didn't have a carriage return (or rather newline) at the end.

    It wasn't entirely clear what the expected output of your program was, but hopefully the above will give enough pointers in the right direction.

    Regards,

    Andrew.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
Reply
  • Andrew Beckett
    Andrew Beckett over 9 years ago

    Hi Sjoerd,

    Was a bit difficult to see the wood from the trees in all of this - but the key problem is the "-" character in the pattern. The trouble is that this is being interpreted as a "range" separator - in fact pcreCompile gives a warning to that respect.

    So if you do this:

    pattern = "[`\\-=;'./~!@$%^&*()_+{}|:\"<>?\\[\\]]"
    ;pattern = "\\S"
    testString = "`-=;'./~!@$%^&*()_+{}|:\"<>?[]"
    pat=pcreCompile(pattern)
    for( i 1 strlen( testString )
      printf( "%L - %L\n" substring( testString i 1 ) pcreExecute(pat substring( testString i 1 ) ) )
    )

    You'll see it works (notice the double backslash before the - in the expression - you can do the same in your main code of course). It's a double backslash, because SKILL also uses backslash to escape characters in strings, and backslash is an escape character in regular expressions, so to get an RE \ you need \\. I also answered the bonus question of how to add [] inside the [] - escape them (see the end of the pattern).

    Note you could also use \\S (see "man perlre" for info on Perl regular expressions) but maybe you want to exclude particular characters - you could use other complex ranges though maybe to make it simpler.

    In order to detect a non-carriage-return terminated line, I just added this to your code:

    printf("READ %L NEWLINE %L\n" nextLine pcreMatchp("\n" nextLine))

    The pcreMatchp would return nil for the last line in the file if it didn't have a carriage return (or rather newline) at the end.

    It wasn't entirely clear what the expected output of your program was, but hopefully the above will give enough pointers in the right direction.

    Regards,

    Andrew.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
Children
No Data

Community Guidelines

The Cadence Design Communities support Cadence users and technologists interacting to exchange ideas, news, technical information, and best practices to solve problems and get the most from Cadence technology. The community is open to everyone, and to provide the most value, we require participants to follow our Community Guidelines that facilitate a quality exchange of ideas and information. By accessing, contributing, using or downloading any materials from the site, you agree to be bound by the full Community Guidelines.

© 2025 Cadence Design Systems, Inc. All Rights Reserved.

  • Terms of Use
  • Privacy
  • Cookie Policy
  • US Trademarks
  • Do Not Sell or Share My Personal Information