英文:
Allow only left aligned zeros using regex
问题
我对使用正则表达式相对不熟悉。我有一个可以采用以下形式的序列号:VV-XXXXXX-P或VVXXXXXXP
如果使用连字符变体,那么'X'的数量可以是可变的。例如,01-162-8等效于010001628。
为了识别这两种格式,我创建了以下正则表达式:
String HYPHENS = ([0]{1}[13]{1}-[1-9]{1,6}-[0-9]{1})
String NO_HYPHENS = ([0]{1}[13]{1}[0-9]{6}[0-9]{1})
但是,NO_HYPHENS 变体的问题是它允许 0 出现在序列中的任何位置
例如:010010628 不应该是一个有效的序列,因为有一个非首位的 0。
另外,我该如何创建一个正则表达式来替换序列中除第一个以外的所有 0?我尝试了以下方式,但它也会替换第一个 0。
String code = 010001234;
code = code.replaceAll("0+", "");
我该如何修改这些正则表达式以实现这一目标?
英文:
I am fairly new to using regex. I have a serial number which can take the following forms: VV-XXXXXX-P or VVXXXXXXP
If the hyphen variant is used, then the number of 'X' can be variable. For example 01-162-8 is equivalent to 010001628.
In order to identify the 2 formats, I have created the following regex's:
String HYPHENS = ([0]{1}[13]{1}-[1-9]{1,6}-[0-9]{1})
String NO_HYPHENS = ([0]{1}[13]{1}[0-9]{6}[0-9]{1})
However the issue with the NO_HYPHENS variant is that it allows 0 anywhere in the sequence
For example: 010010628 should not be a valid sequence because there's a non leading 0.
Additionally, how would I create a regex that I can use to replace all 0 from the sequence but the first one? I have tried the following but it also replaces the first 0.
String code = 010001234;
code = code.replaceAll("0+", "");
How could I modify the regex's to achieve this?
答案1
得分: 2
你可以使用:
String NO_HYPHENS = "0[13](?!0*[1-9]0)[0-9]{6}[0-9]";
code = code.replaceAll("(?!^)0(?!$)", "");
查看正则表达式演示。正则表达式0[13](?!0*[1-9]0)[0-9]{6}[0-9]
匹配:
0
- 零[13]
- 一或三(?!0*[1-9]0)
- 不允许在此位置出现任何后面跟着非零数字再跟零的零[0-9]{6}
- 六位数字[0-9]
- 一位数字。
我明白你在Java中使用它与.matches
,否则,在开头添加^
并在结尾添加$
。
另外,正则表达式(?!^)0(?!$)
会匹配任何不在字符串开头/结尾位置的零。
英文:
You can use
String NO_HYPHENS = "0[13](?!0*[1-9]0)[0-9]{6}[0-9]";
code = code.replaceAll("(?!^)0(?!$)", "");
See the regex demo.
The 0[13](?!0*[1-9]0)[0-9]{6}[0-9]
regex matches:
0
- zero[13]
- one or three(?!0*[1-9]0)
- any zeros followed with a non-zero digit and then a zero is not allowed at this location[0-9]{6}
- six digits[0-9]
- a digit.
I understand you use it in Java with .matches
, else, add ^
at the start and $
at the end.
Also, the (?!^)0(?!$)
regex will match any zero that is not at the string start/end position.
答案2
得分: 1
^0[13]0*[1-9]*[0-9]$
^
- 字符串开始位置
0
- 第一个字符必须为零
[13]
- 第二个字符必须为一或三
0*
- 零的可变长度序列
[1-9]
- 非零数字的可变长度序列
[0-9]
- 最后一个数字(也可以用 \d 替代)
$
- 字符串结束位置
这个正则表达式有一个问题:它没有检查序列号的 XXXXXX 部分有多少个数字。但您可以使用长度函数来检查:
String code = "010000230";
if (code.matches("^0[13]0*[1-9]*[0-9]$") && code.length() == 9) {
// 代码有效
}
// 替换
code = code.replaceAll("^(0[13])0*([1-9]*[0-9])$", "$1$2");
替换的解释:
(0[13])
第一组(括号中的组)
0*
一些零
([1-9]*[0-9])
第二组
将被替换为:
$1$2
第一组和第二组($1 表示第一组)
英文:
^0[13]0*[1-9]*[0-9]$
^
- beginning of string<br>
0
- first sign must be zero<br>
[13]
- second sign must be one or three<br>
0*
- sequence of zeros of variable length<br>
[1-9]
- sequence of non-zeros of variable length<br>
[0-9]
- finally one digit (it can be replaced with \d also)<br>
$
- end of string
This regex has one problem: it doesn't check how many digits are in the XXXXXX section of serial number. But you can check it with length function:
String code = "010000230";
if (code.matches("^0[13]0*[1-9]*[0-9]$") && code.length() == 9) {
// code is valid
}
// replacement
code = code.replaceAll("^(0[13])0*([1-9]*[0-9])$", "$1$2");
Explanation of the replacement:<br>
(0[13])
group number 1 (groups are in bracket)<br>
0*
some zeros<br>
([1-9]*[0-9])
group number 2
This will be replaced with:<br>
$1$2
group number 1 and group number 2 ($1 means group number 1)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论