JavaScript正则表达式限制开头和结尾的下划线

4

我有一个表单,想要限制第一个和最后一个字符。(javascript) 限制条件如下:

  • 输入必须以字母或数字开头和结尾,而中间可以包含下划线。

例如:

 Valid Entries: abc, ABC, Abc123, 123a, Abc_12, Abc_12_3a
 Invalid Entries: _abc, abc_, _abc_

我尝试按以下方式创建我的正则表达式:

^(?!\_)(?!_*_$)[a-zA-Z0-9_]+$

这不允许在开头使用下划线,这很好,但允许在结尾使用下划线,而我想限制它。
有什么建议吗?
谢谢。

const validEntries = ['abc', 'ABC', 'Abc123', '123a', 'Abc_12', 'Abc_12_3a'];
const invalidEntries = ['_abc', 'abc_', '_abc_'];

const regex = /^(?!\_)(?!_*_$)[a-zA-Z0-9_]+$/;

validEntries.forEach((x) => {
  const ret = regex.test(x);
  
  console.log('Should be true :', ret);
});

console.log('-------------------');

invalidEntries.forEach((x) => {
  const ret = regex.test(x);
  
  console.log('Should be false :', ret);
});

---已更新---

我在我的AngularJS应用程序中使用正则表达式。

我创建了如下指令:

       .directive('restrictField', function () {
    return {
        require: 'ngModel',
        restrict: 'A',
        link: function (scope, element, attrs, ctrl) {

            var regReplace,
                preset = {                   
                    'alphanumeric-spl': '\\w_./\s/g',
                    'alphanumeric-underscore': '\\w_',
                    'numeric': '0-9',
                    'alpha-numeric': '\\w'
                },
                filter = preset[attrs.restrictField] || attrs.restrictField;                

            ctrl.$parsers.push(function (inputValue) {
                regReplace = new RegExp('[^' + filter + ']', 'ig');
                if (inputValue == undefined)
                    return ''
                cleanInputValue = inputValue.replace(regReplace, '');
                if (cleanInputValue != inputValue) {
                    ctrl.$setViewValue(cleanInputValue);
                    ctrl.$render();
                }
                return cleanInputValue;
            });
        }
    }
})

我在我的HTML中将其使用为:

我正在将其用作我的HTML:

 <input type="text" name="uname" ng-model="uname" required class="form-control input-medium" restrict-field="alphanumeric-underscore" ng-trim="false" />  

1
尝试使用正则表达式^[a-zA-Z0-9]+(?:_[a-zA-Z0-9]+)*$ - Wiktor Stribiżew
我认为你要找的是(?!.*_$)而不是(?!_*_$) - Bergi
抱歉,我没有提到,连续的下划线也是有效的。 - kaka1234
^(?!_)(?!.*_$)[a-zA-Z0-9_]+$ or ^[a-zA-Z0-9]([a-zA-Z0-9_]*[a-zA-Z0-9])?$ - Wiktor Stribiżew
1个回答

5

您可以添加另一个负向先行断言 ((?!.*_$)) 并使用。

^(?!_)(?!.*_$)[a-zA-Z0-9_]+$

请查看正则表达式演示。前瞻(?!.*_$)会在除换行符之外的0个或多个字符后,如果字符串末尾有_时匹配失败。
另一种方法是使用不含前瞻的模式。
^[a-zA-Z0-9]([a-zA-Z0-9_]*[a-zA-Z0-9])?$
^[a-zA-Z0-9](\w*[a-zA-Z0-9])?$

请参考另一个正则表达式演示。该模式匹配:

  • ^ - 字符串开头
  • [a-zA-Z0-9] - 一个字母数字字符
  • ([a-zA-Z0-9_]*[a-zA-Z0-9])? - 可选序列
    • [a-zA-Z0-9_]* - 0个或多个单词字符(在JS中,您可以将其替换为\w*
    • [a-zA-Z0-9] - 一个字母数字字符
  • $ - 字符串结尾。

关于编辑

您的模式与描述不同步。考虑到preset应包含在replace方法中使用的模式,请尝试以下操作,注意\w匹配_

'alphanumeric-spl': '[^\\w\\s./]+', // Removes all but alnum, _ . / whitespaces
'alphanumeric-underscore': '^_+|_+$|_+(?=_)|\\W+', // Removes all _ at start/end and all _ before a _ and all but alnum and _
'numeric': '[^0-9]+',  // Removes all but digits
'alpha-numeric': '[\\W_]+'  // Removes all but alnum

然后

regReplace = new RegExp(filter, 'ig');

能否根据我在jsfiddle https://jsfiddle.net/d5ofunL8/8/ 中的代码进行调整?我在这里使用了许多表达式,将它们传递给regexreplace函数。而您更新的代码中已经删除了我调用它的方式。 - kaka1234
我可以在这里分享我的代码吗?我想展示一下我之前使用的 AngularJS 指令。 - kaka1234
@kaka1234 请将所有相关代码添加到问题中。 - Wiktor Stribiżew
Wiktor,这是一个文本框类型的输入。是否有其他选项/解决方法来限制或使用此类正则表达式在文本框上? - kaka1234
@kaka1234 抱歉,我不明白你的意思。我的回答中提出了一种可行的方法。 - Wiktor Stribiżew
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接