Beefy Boxes and Bandwidth Generously Provided by pair Networks
Don't ask to ask, just ask
 
PerlMonks  

Re^2: Function for reading file

by shabird (Sexton)
on Mar 28, 2020 at 13:11 UTC ( [id://11114750]=note: print w/replies, xml ) Need Help??


in reply to Re: Function for reading file
in thread Function for reading file

How can i use it without the word regex \W ?

Replies are listed 'Best First'.
Re^3: Function for reading file
by davido (Cardinal) on Mar 28, 2020 at 23:36 UTC

    Is your goal really to match every character in the ASCII character set except for 0-9 and _ (underscore)? I couldn't suggest a better alternative without knowing exactly what you want. However, again if you're only working with ASCII and not Unicode, these expressions do the same thing, in slightly different ways:

    • [A-Za-z\W] - Match A-Z, or a-z or any character that is not A-Z a-z, 0-9, _. This reduces to matching all characters that are not 0-9, _.
    • [^_\d] - Match any character that is not _ or 0-9. Much simpler way to state the previous expression.
    • (?!_)\D - Don't match if the next character will be an underscore, and don't match if that character is 0-9. This one uses look-ahead to check first if the next thing would not be _, then advances the position in the string and checks if the current thing is not 0-9. It uses lookahead, and then look at semantics.
    • \D(?<!_) - Don't match if the current character is 0-9. Also if that character was _ (underscore) fail to match. This checks the character at the current position, and then after advancing the marker in the string looks back to see that it was also not underscore. It uses look-at, and then lookbehind semantics.

    Of these options the second one is certainly the easiest to read. But my point in my previous post was that I'm doubtful this is exactly what you want. It seems very suspect to allow matching \t, \n, (, ), ^, -, A, B, z, ' '(space), ','(comma), and so on, but to disallow any numeric digit and the underscore. It doesn't seem like it's doing what you want it to be doing. But you didn't make clear to me what it is that you actually want to do.

    Furthermore, if you are dealing with Unicode semantics, the number of characters that are matched by that pattern is enormous, and even weirder. If you suggested what you're trying to match we might be able to help come up with a more specific expression.


    Dave

Re^3: Function for reading file
by AnomalousMonk (Archbishop) on Mar 29, 2020 at 01:42 UTC
    ... the word regex \W ...

    It's important to understand what you're dealing with. The  \W (that's big-W) character class (see perlrecharclass) matches any character that is not a  \w (little-w) character. The  \w characters are sometimes called "word" characters, but IIRC they originate with the set of characters that are allowed in a C- or Perl-language identifier; that's why  _ (underscore) is included, but  - (hyphen), for instance, is not. So  \W is better described as the anti-word regex!

    And I agree with davido's point here that if  [A-Za-z\W] really does the trick for you, then  [^_\d] is more clear, readable, maintainable, and IMHO preferable.

    Update: Made "identifier" into a Wikipedia link.


    Give a man a fish:  <%-{-{-{-<

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://11114750]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others scrutinizing the Monastery: (4)
As of 2024-03-28 20:23 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found