我正在尝试使用正则表达式来匹配给定字符串的所有组合。例如,字符串是" 1234",答案包括:
非示例包括:
如果重要,我使用的编程语言是javascript。
感谢您的帮助。
答案 0 :(得分:3)
您可以在正则表达式中使用这种基于前瞻性的断言:
^(?!(?:[^1]*1){2})(?!(?:[^2]*2){2})(?!(?:[^3]*3){2})(?!(?:[^4]*4){2})[1234]+$
这里有4个前瞻断言:
(?!(?:[^1]*1){2})
:断言我们没有多个1
(?!(?:[^2]*2){2})
:断言我们没有多个2
(?!(?:[^3]*3){2})
:断言我们没有多个3
(?!(?:[^4]*4){2})
:断言我们没有多个4
我们使用[1234]+
匹配任意包含这4个字符的字符串。
答案 1 :(得分:2)
使用字符类的组捕获和使用反向引用的负向前瞻断言的组合可以解决这个问题。
让我们首先使用字符类[1-4]
简单地匹配1,2,3和4的任意组合,并允许任意长度为1到4个字符。 {1,4}
。
const regex = /^[1-4]{1,4}$/;
// Create set of inputs from 0 to 4322
const inputs = Array.from(new Array(4323), (v, i) => i.toString());
// Output only values that match criteria
console.log(inputs.filter((input) => regex.test(input)));
当运行该代码时,很容易看出虽然只有1,2,3和4的某些组合组成的数字匹配,但它也匹配重复组合的数字(例如11,22,33,112)等)。显然,这不是所期望的。
要防止重复字符,需要引用先前匹配的字符,然后从后续匹配的字符中取消它们。使用反向引用(?!...)
的负前瞻\1-9
可以实现此目的。
在上一个示例的基础上,输入的子集(当前限制为两个字符的最大长度)现在将包含围绕第一个字符([1-4])
的组匹配,然后是负面外观 - 前面是对第一个捕获的反向引用,(?!\1)
,最后是第二个可选的字符类。
const regex = /^([1-4])(?!\1)[1-4]?$/;
// Create set of inputs from 0 to 44
const inputs = Array.from(new Array(45), (v, i) => i.toString());
// Output only values that match criteria
console.log(inputs.filter((input) => regex.test(input)));
这匹配所需的字符而不重复!
扩展此模式以包含每个先前匹配的字符的反向引用,直到所需的最大长度为4,得到以下表达式。
const regex = /^([1-4])((?!\1)[1-4])?((?!\1|\2)[1-4])?((?!\1|\2|\3)[1-4])?$/;
// Create set of inputs from 0 to 4322
const inputs = Array.from(new Array(4323), (v, i) => i.toString());
// Output only values that match criteria
console.log(inputs.filter((input) => regex.test(input)));
希望这有帮助!
答案 2 :(得分:1)
您不需要为此使用正则表达式。下面的代码段执行以下操作:
1
)(123
,4321
,s2 = s
等。)x => ch
)1234
)(1
=> 2
,3
,4
,s2.replace
)的字符1
)
1
组合中,当1
中的字符1234
导致空字符串0
将被替换
s2.length == 0
(const x = "1234"
const a = ["1","123","4321","4312","11","11234","44132"]
a.forEach(function(s) {
var s2 = s
for(var ch of x) {
s2 = s2.replace(ch, '')
if(s2.length == 0) {
console.log(s);
break;
}
}
})
),则将结果写入控制台并跳出循环(没有必要继续尝试替换空字符串)
1
123
4321
4312

结果:
module.exports = function (array){
var firstBigNumber = 0;
var secondBigNumber = 0;
if(array.length === 0) return 0;
for(var index = 0; index < array.length; index++){
if(parseInt(array[index]) === array[index]){
if(array[index] > 0){
if(array[index] > firstBigNumber){
secondBigNumber = firstBigNumber;
firstBigNumber = array[index];
}else if (array[index] > secondBigNumber) {
secondBigNumber = array[index];
}
}
}
else{
secondBigNumber = 0;
firstBigNumber = 0;
}
}
return [firstBigNumber,secondBigNumber];
}