匹配-和逗号

时间:2019-02-18 16:19:29

标签: javascript

我正在尝试根据这些参数验证给定的输入 有一种情况我无法弄清楚如何验证

没有逗号我不能有两个破折号// 123-455-908无效 而且我无法在Reg中添加该条件

我有这个正则表达式

/^([0-9]+[-,]{0,1})*$/

这是我的代码

let regexp, x, y
 regexp = /^([0-9]+[-,]{0,1})*$/
 x = "123,,"
regexp.test(x)

这些是允许的:

  

123-234,456
  123-345
  123,456
  12
  1

不允许这些:

  

123--234
  123-345-456
  123 ,,
  123,455
  -123-34
  ,123

除数字,破折号或逗号外,不得使用其他任何东西

这些是一些示例,希望您能理解

任何对此的帮助将不胜感激

3 个答案:

答案 0 :(得分:2)

您可以通过从^开始到$边界REGEX结束这种方式

^\d{1,}(?:-|,)?(?:\d+,?\d+)?$

const regex = /^\d{1,}(?:-|,)?(?:\d+,?\d+)?$/gmi;
const str = `123--234
123-345-456
123,,
123,,455
-123-34
,123 

123-234,456
123-345
123,456
12
1`;
let m;

while ((m = regex.exec(str)) !== null) {
  // This is necessary to avoid infinite loops with zero-width matches
  if (m.index === regex.lastIndex) {
    regex.lastIndex++;
  }

  // The result can be accessed through the `m`-variable.
  m.forEach((match, groupIndex) => {
    console.log(`Found match: ${match}`);
  });
}

答案 1 :(得分:0)

这个怎么样?

^(\d{1,3}-)?\d{1,3}(,(\d{1,3}-)?\d{1,3})*$

(\d{1,3}-)?\d{1,3}验证一个代码实例,而(,(\d{1,3}-)?\d{1,3})*处理重复代码。

答案 2 :(得分:0)

也许只是我一个人,但是我觉得在尝试针对多个需求验证字符串时,将正则表达式分解成较小的部分会更容易。

这样做的一个 pro 是每个正则表达式都变得超级简化了
但这会带来一个 con ,即您的代码中包含更多正则表达式。

let tests = [
'123-234,456',
'123-345',
'123,456',
'12',
'1',
'123--234',
'123-345-456',
'123,,',
'123,,455',
'-123-34',
',123',
'abc-123',
'a,b,c',
'abc']

function evaluate(str) {
  // Remove anything that isn't a number, ',' or '-' 
  // they will be the same length nothing was removed
  if(str.replace(/[^0-9,-]/g, '') != str) return false
  // Make sure there is no more than one '-'
  if((str.match(/-/g) || []).length > 1) return false
  // Make sure there is no more than one ','
  if((str.match(/,/g) || []).length > 1) return false
  // Make sure the string doesn't start with a ','
  if(str.match(/^,/) != null) return false

  // All tests have passed return true as it is a valid string
  return true
}

tests.forEach(i => console.log("Valid:", evaluate(i), i))