regex 需要验证以检查多种格式

sf6xfgos  于 2023-06-25  发布在  其他
关注(0)|答案(3)|浏览(71)

我正在验证多种格式的字符串。

  • 任何整数x(匹配),如果(x < 2)不匹配。
  • 带连字符x-y的数字,如果(y > x)匹配,x-y-z(不匹配)
  • 格式- x;y; z;g(matched),x; x;z;z(不匹配)*

始终值>= 2
我创建了一个regexp ^\d+((;\d+)*|-\d+)?$,但有问题:

  • 2格式,如果(y < x)匹配
  • 3格式x;z; z匹配
eqqqjvef

eqqqjvef1#

所以我们有一个正则表达式/^[\d;]+$|^(\d+)(-)(\d+)$/
它有两个子模式:第一个匹配数字与';',则2n匹配<num>-<num>。所以如果它与第二个匹配,它将包含4个项目:1.整个字符串。2.第一个数字。3.分隔符'-'。4.第二个数字。然后我们检查哪个子模式匹配并相应地处理:

const valid = str => {
  let set, match = str.match(/^[\d;]+$|^(\d+)(-)(\d+)$/);
  return match && (match[2] === '-' && match[3] - match[1] > 0 && match[1] >= 2) ||
  (set = new Set) && str.split(';').every(num => num >= 2 && !set.has(num) && set.add(num));
};
  

const strings = ["1-20", "2;3;2", "5-4", "a;1", "2;301;44", "2", "2-3", "6-90", "2;3;4;5", "5;4", "2-3-5", "3;1"];

for(const str of strings){
  console.log(str, ':', valid(str));
}
niknxzdl

niknxzdl2#

要使用jQuery验证多种格式,可以利用正则表达式(regex)来匹配所需的格式。下面是一个如何实现的示例:

<!DOCTYPE html>
<html>
<head>
  <title>Format Validation</title>
</head>
<body>
  <form id="form-example">
    <input type="text" id="myInput">
    <input type="submit" value="Submit">
  </form>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
  <script>
    $(document).ready(function() {
      $('#form-example').submit(function(event) {
        event.preventDefault(); // Prevent form submission

        // Get the input value
        var inputValue = $('#myInput').val();

        // Define the regex patterns for the allowed formats
        var emailRegex = /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$/;
        var phoneRegex = /^\d{10}$/;
        var dateRegex = /^\d{2}\/\d{2}\/\d{4}$/;

        // Check if the input matches any of the defined formats
        if (emailRegex.test(inputValue)) {
          alert('Valid email format');
        } else if (phoneRegex.test(inputValue)) {
          alert('Valid phone number format');
        } else if (dateRegex.test(inputValue)) {
          alert('Valid date format');
        } else {
          alert('Invalid format');
        }
      });
    });
  </script>
</body>
</html>
e4yzc0pl

e4yzc0pl3#

只使用正则表达式,你不能做数学。
您可以使用3个捕获组更新模式,然后使用parseInt处理x-y场景,并确保y > x
对于x;y; z场景中,您可以在;上进行拆分,并检查是否没有重复的值。

^([2-9]|[1-9]\d+)(?:-([2-9]|[1-9]\d+)|((?:;(?:[2-9]|[1-9]\d+))+))?$

模式匹配:

  • ^字符串开始
  • ([2-9]|[1-9]\d+)捕获组1,匹配数字2-9或10+
  • (?: 2个备选方案的非捕获组:
  • -([2-9]|[1-9]\d+)捕获组2,匹配-,后跟数字2-9或10+
  • |
  • (捕获组3
  • (?:;(?:[2-9]|[1-9]\d+))+匹配1+重复;和数字2-9或10+
  • )关闭组3
  • )?关闭非捕获组并将其设为可选
  • $字符串结束

Regex demo

const regex = /^([2-9]|[1-9]\d+)(?:-([2-9]|[1-9]\d+)|((?:;(?:[2-9]|[1-9]\d+))+))?$/;
[
  "1", "1;1", "1-2", "3-2", "9-7", "9-8", "2", "2-1", "2-3", "5;4", "6-90", "3;2;1", "2;3;4;3", "6-90-1", "1;2;3", "2;3;4;1", "2;1;2", "2;3;4;9", "1;2;3", "3;2;1", "1;2;3;1", "2;301;44"
].forEach(s => {
  const m = s.match(regex);
  if (m) {
    const gr1 = parseInt(m[1]);
    if (undefined !== m[2] && parseInt(m[2]) > gr1)
      console.log(`Correct for ${s}`);
    if (undefined === m[2] && undefined === m[3])
      console.log(`Correct for ${s}`);
    if (undefined !== m[3]) {
      const parts = m[3].split(";").filter(Boolean).concat(m[1])
      if ((new Set(parts)).size === parts.length)
        console.log(`Correct for ${s}`);
    }
  }
})

相关问题