I need to remove all non-numeric characters from a string. Because people use different thousands separators - and some people thought using commas for this purpose was perfectly fine and not at all easily confused with a decimal point (especially since some countries use commas for decimal points), the regex is shaping up to be annoying.
Here's my current attempt:
[^\d,.]|[.,](?=.*[.,])|(?<=,.*),
[^\d,.] match all non-numeric characters that aren't commas or dots (because they also use ' and ’ as separators, not just dots and commas)
[.,](?=.*[.,]) match all commas and dots that are still followed by a dot or comma
(?<=,.*), match all commas if we've previously seen a comma, already
(I'll probably have to split (2) into two cases, later, but that's not the issue of this question.
The purpose of (3) is that if the string contains multiple commas, we can safely assume that it's used as a thousands separator and not as a decimal point.
I.e.
123,456 should be interpreted as 123.456 (and therefore the , not match the regex)
123,456,789 should be interpreted as 123456789 (and therefore both commas match the regex)
Of course (?<=,.*), is not valid because look-behinds need be a fixed length and .* is not.
How do I match these pesky commas?
(The intention is to eventually feed the regex to a Java string replacement method.)
var sanitisedInput = rawInput.replaceAll(<regex>, "")
The below regex pattern might help.
Pattern: (?:(?<=\.)|,)(\d+)(?:(?=\.)|,)
Replacement: \1
Demo: https://regex101.com/r/KtFX8S/2/
Explanation:
(?<=\.)|,) - Match either , or positive lookbehind of ..
Similarly match pattern at the end
Use the captured group 1 in the replacement
Right now I have a regex that prevents the user from typing any special characters. The only allowed characters are A through Z, 0 through 9 or spaces.
I want to improve this regex to prevent the following:
No leading/training spaces - If the user types one or more spaces before or after the entry, do not allow.
No double-spaces - If the user types the space key more than once, do not allow.
The Regex I have right now to prevent special characters is as follows and appears to work just fine, which is:
^[a-zA-Z0-9 ]+$
Following some other ideas, I tried all these options but they did not work:
^\A\s+[a-zA-Z0-9 ]+$\A\s+
/s*^[a-zA-Z0-9 ]+$/s*
Could I get a helping hand with this code? Again, I just want letters A-Z, numbers 0-9, and no leading or trailing spaces.
Thanks.
You can use the following regex:
^[a-zA-Z0-9]+(?: [a-zA-Z0-9]+)*$
See regex demo.
The regex will match alphanumerics at the start (1 or more) and then zero or more chunks of a single space followed with one or more alphanumerics.
As an alternative, here is a regex based on lookaheads (but is thus less efficient):
^(?!.* {2})(?=\S)(?=.*\S$)[a-zA-Z0-9 ]+$
See the regex demo
The (?!.* {2}) disallows consecutive spaces and (?=.*\S$) requires a non-whitespace to be at the end of the string and (?=\S) requires it at the start.
We have some fields with user input; and so far our rule to validate this content was [A-Z][A-Z0-9]{0,7}.
Meaning: any uppercase word with at least one character; starting with a character; and up to 8 characters for the whole word.
Now I am told that we should accept "trailing" spaces as well; but of course - only trailing spaces. Update; as the first answer got that wrong: the maximum length of the whole word is still 8 characters! Because that is exactly the point that caused me to ask this question.
I guess this can be checked with TWO expressions:
a) [A-Z][A-Z0-9 ]{0,7}... must match the input and
b) [ ][A-Z0-9] must not match the input
(the second expression simply finding any "non-trailing" space)
But is there also a SINGLE regular expression that I could use to check for this condition?
Or is this one of the occasions, where well, though luck - regular expressions only accept context free grammars?!
If you want to allow trailing spaces only then use:
^[A-Z][A-Z0-9]{0,7} *$
Or:
^[A-Z][A-Z0-9]{0,7}\h*$
Here \h* is horizontal whitespace that matches 0 or space or tab characters at the end only.
EDIT: Based on edited question you can use this lookahead based regex:
^(?=[A-Z0-9\h]{1,8}$)[A-Z][A-Z0-9]*\h*$
RegEx Demo
Regular expression that matches based on the below
It is min 12 or max 13 characters
Can have leading spaces/Zeros
No blank spaces in the String
Not all Zeros/spaces
Correct Match:
" ABCDEFGHIJ"
"ABCDEFGHIJKLM"
Wrong Match:
"ABCD IJKL"
Are you saying the whole string has to be 12 or 13 characters long including the leading whitespace? This will work in most regex flavors:
^(?=.{12,13}$)\s*[A-Za-z0-9]+$
I'm not sure about ABAP though. Many of the search hits I've found suggest that it supports lookaheads, but if you're really using POSIX standard regexes, this won't work. You would probably have to do the length check in a separate test.
UPDATE: To prevent a match of all zeroes, you'll need to add another lookahead:
^(?=.{12,13}$)(?!0+$)\s*[A-Za-z0-9]+$
UPDATE 2: It just occurred to me that you probably don't want strings like " 000000000" -- i.e., all zeroes plus leading spaces. This regex will cover that:
^(?=.{12,13}$)(?!\s*0+$)\s*[A-Za-z0-9]+$
You can use this regex:
^ *[A-Za-z0-9]{12,13}$
\s*\b[a-zA-Z0-9]{12,13}\b
This doesn't require the string to be on its own line. If you don't actually care about matching the initial whitespace you can get rid of the \s*
You just want optional leading spaces:
\s*[A-Za-z0-9]{12}
I want a regular expression that prevents symbols and only allows letters and numbers. The regex below works great, but it doesn't allow for spaces between words.
^[a-zA-Z0-9_]*$
For example, when using this regular expression "HelloWorld" is fine, but "Hello World" does not match.
How can I tweak it to allow spaces?
tl;dr
Just add a space in your character class.
^[a-zA-Z0-9_ ]*$
Now, if you want to be strict...
The above isn't exactly correct. Due to the fact that * means zero or more, it would match all of the following cases that one would not usually mean to match:
An empty string, "".
A string comprised entirely of spaces, " ".
A string that leads and / or trails with spaces, " Hello World ".
A string that contains multiple spaces in between words, "Hello World".
Originally I didn't think such details were worth going into, as OP was asking such a basic question that it seemed strictness wasn't a concern. Now that the question's gained some popularity however, I want to say...
...use #stema's answer.
Which, in my flavor (without using \w) translates to:
^[a-zA-Z0-9_]+( [a-zA-Z0-9_]+)*$
(Please upvote #stema regardless.)
Some things to note about this (and #stema's) answer:
If you want to allow multiple spaces between words (say, if you'd like to allow accidental double-spaces, or if you're working with copy-pasted text from a PDF), then add a + after the space:
^\w+( +\w+)*$
If you want to allow tabs and newlines (whitespace characters), then replace the space with a \s+:
^\w+(\s+\w+)*$
Here I suggest the + by default because, for example, Windows linebreaks consist of two whitespace characters in sequence, \r\n, so you'll need the + to catch both.
Still not working?
Check what dialect of regular expressions you're using.* In languages like Java you'll have to escape your backslashes, i.e. \\w and \\s. In older or more basic languages and utilities, like sed, \w and \s aren't defined, so write them out with character classes, e.g. [a-zA-Z0-9_] and [\f\n\p\r\t], respectively.
* I know this question is tagged vb.net, but based on 25,000+ views, I'm guessing it's not only those folks who are coming across this question. Currently it's the first hit on google for the search phrase, regular expression space word.
One possibility would be to just add the space into you character class, like acheong87 suggested, this depends on how strict you are on your pattern, because this would also allow a string starting with 5 spaces, or strings consisting only of spaces.
The other possibility is to define a pattern:
I will use \w this is in most regex flavours the same than [a-zA-Z0-9_] (in some it is Unicode based)
^\w+( \w+)*$
This will allow a series of at least one word and the words are divided by spaces.
^ Match the start of the string
\w+ Match a series of at least one word character
( \w+)* is a group that is repeated 0 or more times. In the group it expects a space followed by a series of at least one word character
$ matches the end of the string
This one worked for me
([\w ]+)
Try with:
^(\w+ ?)*$
Explanation:
\w - alias for [a-zA-Z_0-9]
"whitespace"? - allow whitespace after word, set is as optional
I assume you don't want leading/trailing space. This means you have to split the regex into "first character", "stuff in the middle" and "last character":
^[a-zA-Z0-9_][a-zA-Z0-9_ ]*[a-zA-Z0-9_]$
or if you use a perl-like syntax:
^\w[\w ]*\w$
Also: If you intentionally worded your regex that it also allows empty Strings, you have to make the entire thing optional:
^(\w[\w ]*\w)?$
If you want to only allow single space chars, it looks a bit different:
^((\w+ )*\w+)?$
This matches 0..n words followed by a single space, plus one word without space. And makes the entire thing optional to allow empty strings.
This regular expression
^\w+(\s\w+)*$
will only allow a single space between words and no leading or trailing spaces.
Below is the explanation of the regular expression:
^ Assert position at start of the string
\w+ Match any word character [a-zA-Z0-9_]
Quantifier: + Between one and unlimited times, as many times as possible, giving back as needed [greedy]
1st Capturing group (\s\w+)*
Quantifier: * Between zero and unlimited times, as many times as possible, giving back as needed [greedy]
\s Match any white space character [\r\n\t\f ]
\w+ Match any word character [a-zA-Z0-9_]
Quantifier: + Between one and unlimited times, as many times as possible, giving back as needed [greedy]
$ Assert position at end of the string
Just add a space to end of your regex pattern as follows:
[a-zA-Z0-9_ ]
This does not allow space in the beginning. But allowes spaces in between words. Also allows for special characters between words. A good regex for FirstName and LastName fields.
\w+.*$
For alphabets only:
^([a-zA-Z])+(\s)+[a-zA-Z]+$
For alphanumeric value and _:
^(\w)+(\s)+\w+$
If you are using JavaScript then you can use this regex:
/^[a-z0-9_.-\s]+$/i
For example:
/^[a-z0-9_.-\s]+$/i.test("") //false
/^[a-z0-9_.-\s]+$/i.test("helloworld") //true
/^[a-z0-9_.-\s]+$/i.test("hello world") //true
/^[a-z0-9_.-\s]+$/i.test("none alpha: ɹqɯ") //false
The only drawback with this regex is a string comprised entirely of spaces. " " will also show as true.
It was my regex: #"^(?=.{3,15}$)(?:(?:\p{L}|\p{N})[._()\[\]-]?)*$"
I just added ([\w ]+) at the end of my regex before *
#"^(?=.{3,15}$)(?:(?:\p{L}|\p{N})[._()\[\]-]?)([\w ]+)*$"
Now string is allowed to have spaces.
This regex allow only alphabet and spaces:
^[a-zA-Z ]*$
Try with this one:
result = re.search(r"\w+( )\w+", text)