匹配给定前缀和后缀的正则表达式
REGEX to MATCH a given PREFIX and SUFFIX
我有以下组成的字符串:
- 前缀 + 后缀(它们之间可以包含空格)
- 前缀为ALFA(长度可变,大写或小写,可能不存在)
- 后缀为 NUMERIC(长度可变,可能包含空格)
我需要一个正则表达式来匹配给定的(变量)前缀和后缀
示例(前缀=ABCD,后缀=123456789):
String to match (several possible combinations):
ABCD123456789
abcd123456789
ABCD 123456789
abcd 123456789
ABCD 123 456 789
abcd 123 456 789
123456789
123 456 789
String matches
+--------+-------------------+-------+
| PREFIX | SUFFIX | MATCH |
+--------+-------------------+-------+
| | 123456789 | YES |
| | 123 456 789 | YES |
| | 1 2 3 4 5 6 7 8 9 | YES |
| ABCD | 123 456 789 | YES |
| ABCD | 1 2 3 4 5 6 7 8 9 | YES |
+--------+-------------------+-------+
| | 12345678 | NO |
| | 123 456 7890 | NO |
| ABCD | 12345678 | NO |
| ABCD | 123 456 7890 | NO |
| | 123456789 ABCD | NO |
| AB | 123456789 | NO |
+--------+-------------------+-------+
换句话说:
- 如果前缀必须匹配(不区分大小写),如果不存在则必须忽略
- 后缀必须匹配(必须忽略空格!)
等效的 JAVA 代码 将是:
//remove prefix (case insensitive)
STRING.substring(STRING.toUpperCase().startsWith(PREFIX) ? PREFIX.length() : 0).
//remove spaces
replace(" ","").
//match
equals(SUFFIX);
非常感谢。
我知道你的问题有一个 Java 标签,但我不熟悉 Java。由于 Java 和 JavaScript 有一些相似之处,这里有一个 JavaScript 实现来获取灵感。
var rows = [{
prefix: null,
suffix: '123456789',
assert: true
}, {
prefix: null,
suffix: '1123 456 789',
assert: true
}, {
prefix: null,
suffix: '1 2 3 4 5 6 7 8 9',
assert: true
}, {
prefix: 'ABCD',
suffix: '123 456 789',
assert: true
}, {
prefix: 'ABCD',
suffix: '1 2 3 4 5 6 7 8 9',
assert: true
},
{
prefix: null,
suffix: '12345678',
assert: false
}, {
prefix: null,
suffix: '123 456 7890',
assert: false
}, {
prefix: 'ABCD',
suffix: '12345678',
assert: false
}, {
prefix: 'ABCD',
suffix: '123 456 7890',
assert: false
}, {
prefix: null,
suffix: '123456789 ABCD',
assert: false
}, {
prefix: 'AB',
suffix: '123456789',
assert: false
}];
var PREFIX = 'ABCD';
var SUFFIX = '123456789';
var separator = '_';
var regex = new RegExp('^(' + PREFIX.toLowerCase() + ')?' + separator + '.*' + SUFFIX.replace(/\s+/g, '') + '$', 'g');
document.write('<pre>generated regex: ' + regex + '</pre>');
for (var i = 0; i < rows.length; i++) {
regex.lastIndex = 0;
var item = rows[i];
var pre = (item.prefix || '').toLowerCase();
var suf = item.suffix.replace(/\s+/g, '');
var subject = pre + separator + suf;
var result = regex.test(subject);
document.write('<pre class="' + ((result === item.assert) ? 'success' : 'fail') + '">' + pre + ' ' + suf + ', expected: ' + item.assert + ', result: ' + result + '</pre>');
}
pre { padding: 5px; }
.success { border: 1px solid green; }
.fail { border: 1px solid red; }
删除所有空格 in/around 数字后缀第一个:
str.replaceAll(" (?=[\d ]*$)", "").matches("(?i)(ABCD)?123456789")
匹配你所有的测试用例(不匹配你的不匹配)。
我有以下组成的字符串:
- 前缀 + 后缀(它们之间可以包含空格)
- 前缀为ALFA(长度可变,大写或小写,可能不存在)
- 后缀为 NUMERIC(长度可变,可能包含空格)
我需要一个正则表达式来匹配给定的(变量)前缀和后缀
示例(前缀=ABCD,后缀=123456789):
String to match (several possible combinations):
ABCD123456789
abcd123456789
ABCD 123456789
abcd 123456789
ABCD 123 456 789
abcd 123 456 789
123456789
123 456 789
String matches
+--------+-------------------+-------+
| PREFIX | SUFFIX | MATCH |
+--------+-------------------+-------+
| | 123456789 | YES |
| | 123 456 789 | YES |
| | 1 2 3 4 5 6 7 8 9 | YES |
| ABCD | 123 456 789 | YES |
| ABCD | 1 2 3 4 5 6 7 8 9 | YES |
+--------+-------------------+-------+
| | 12345678 | NO |
| | 123 456 7890 | NO |
| ABCD | 12345678 | NO |
| ABCD | 123 456 7890 | NO |
| | 123456789 ABCD | NO |
| AB | 123456789 | NO |
+--------+-------------------+-------+
换句话说:
- 如果前缀必须匹配(不区分大小写),如果不存在则必须忽略
- 后缀必须匹配(必须忽略空格!)
等效的 JAVA 代码 将是:
//remove prefix (case insensitive)
STRING.substring(STRING.toUpperCase().startsWith(PREFIX) ? PREFIX.length() : 0).
//remove spaces
replace(" ","").
//match
equals(SUFFIX);
非常感谢。
我知道你的问题有一个 Java 标签,但我不熟悉 Java。由于 Java 和 JavaScript 有一些相似之处,这里有一个 JavaScript 实现来获取灵感。
var rows = [{
prefix: null,
suffix: '123456789',
assert: true
}, {
prefix: null,
suffix: '1123 456 789',
assert: true
}, {
prefix: null,
suffix: '1 2 3 4 5 6 7 8 9',
assert: true
}, {
prefix: 'ABCD',
suffix: '123 456 789',
assert: true
}, {
prefix: 'ABCD',
suffix: '1 2 3 4 5 6 7 8 9',
assert: true
},
{
prefix: null,
suffix: '12345678',
assert: false
}, {
prefix: null,
suffix: '123 456 7890',
assert: false
}, {
prefix: 'ABCD',
suffix: '12345678',
assert: false
}, {
prefix: 'ABCD',
suffix: '123 456 7890',
assert: false
}, {
prefix: null,
suffix: '123456789 ABCD',
assert: false
}, {
prefix: 'AB',
suffix: '123456789',
assert: false
}];
var PREFIX = 'ABCD';
var SUFFIX = '123456789';
var separator = '_';
var regex = new RegExp('^(' + PREFIX.toLowerCase() + ')?' + separator + '.*' + SUFFIX.replace(/\s+/g, '') + '$', 'g');
document.write('<pre>generated regex: ' + regex + '</pre>');
for (var i = 0; i < rows.length; i++) {
regex.lastIndex = 0;
var item = rows[i];
var pre = (item.prefix || '').toLowerCase();
var suf = item.suffix.replace(/\s+/g, '');
var subject = pre + separator + suf;
var result = regex.test(subject);
document.write('<pre class="' + ((result === item.assert) ? 'success' : 'fail') + '">' + pre + ' ' + suf + ', expected: ' + item.assert + ', result: ' + result + '</pre>');
}
pre { padding: 5px; }
.success { border: 1px solid green; }
.fail { border: 1px solid red; }
删除所有空格 in/around 数字后缀第一个:
str.replaceAll(" (?=[\d ]*$)", "").matches("(?i)(ABCD)?123456789")
匹配你所有的测试用例(不匹配你的不匹配)。