I want to write a regex for the following strings to include all strings:
B9966
ch6258
028
chIRZ170
IRZ170
B8966A
BA966C
The OUTPUT should be as follows:
966
6258
028
170
170
966A
BA966C
Conditions:
- If you look at b9966, you see that its output is 966. it means If the string started with one character, the next digit of the character is not part of the output.
- If the string is an integer, the whole string is output.
- I want the output of B8966A to be like this 966A.
- Otherwise, if the previous three conditions do not exist, all string digits are returned as output.
I wanted to write with conditions in regex (ie: (?(?condition)then|else)
) but found that javascript does not support conditions.
For example, the following solution works fine, but I'm looking for a more professional regex:
^\d .|(?<=^\D{1}\d)\d .|(?<=^\D{2,})\d .
CodePudding user response:
For your example data, you can remove either an uppercase case followed by a single digit, or remove all non digits.
[A-Z]\d|[^\d\n]
const regex = /[A-Z]\d|[^\d\n] /g;
[
"B9966",
"ch6258",
"028",
"chIRZ170",
"IRZ170"
].forEach(s => console.log(s.replace(regex, '')));
<iframe name="sif1" sandbox="allow-forms allow-modals allow-scripts" frameborder="0"></iframe>
Edit
For the updated examples, you could start the match with a non digit followed by a digit, or match 1 non digits:
\b(?:[^\d\n]\d|[^\d\n] )
To not touch the last example, you can use a negative lookahead:
\b(?:[^\d\n]\d|(?![A-Z]{2}\d)[^\d\n] )
const regex = /\b(?:[^\d\n]\d|(?![A-Z]{2}\d)[^\d\n] )/;
[
"B9966",
"ch6258",
"028",
"chIRZ170",
"IRZ170",
"B8966A",
"BA966C"
].forEach(s => console.log(s.replace(regex, '')));
<iframe name="sif2" sandbox="allow-forms allow-modals allow-scripts" frameborder="0"></iframe>