正则表达式匹配给定字符串

时间:2018-04-17 15:50:57

标签: javascript regex regex-lookarounds regex-greedy

我正在尝试使用正则表达式来匹配给定字符串的所有组合。例如,字符串是" 1234",答案包括:

  1. " 1"
  2. " 123"
  3. " 4321"
  4. " 4312"
  5. 非示例包括:

    1. " 11"
    2. " 11234"
    3. " 44132"
    4. 如果重要,我使用的编程语言是javascript。

      感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

您可以在正则表达式中使用这种基于前瞻性的断言:

^(?!(?:[^1]*1){2})(?!(?:[^2]*2){2})(?!(?:[^3]*3){2})(?!(?:[^4]*4){2})[1234]+$

RegEx Demo

这里有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. 循环可能的组合(1)(1234321s2 = s等。)
  2. 复制当前组合,以免覆盖它(x => ch
  3. 循环测试字符串(1234)(1 => 234s2.replace)的字符
  4. 替换与测试字符串共享的组合字符串中的常用字符(1
    • 例如,在1组合中,当1中的字符1234导致空字符串
    • 时,0将被替换
  5. 如果组合字符串的长度达到s2.length == 0const 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; } } })),则将结果写入控制台并跳出循环(没有必要继续尝试替换空字符串)
  6. 
    
    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];
    }