繁体   English   中英

正则表达式字符串以不能在 Javascript 中工作结束

[英]Regex string ends with not working in Javascript

我对正则表达式不是很熟悉。 我试图测试一个字符串是否以另一个字符串结尾。 当我期望为真时,下面的代码返回 null。 代码有什么问题?

var id = "John";
var exists  ="blahJohn".match(/id$/);
alert(exists);

好吧,使用这种方法,您需要使用RegExp构造函数,使用您的id变量构建正则表达式:

var id = "John";
var exists = new RegExp(id+"$").test("blahJohn");
alert(exists);

但是有很多方法可以实现这一点,例如,您可以获取字符串的最后一个id.length字符,并将其与id进行比较:

var id = "John";
var exist = "blahJohn".slice(-id.length) == id; // true

您需要使用RegExp()对象来执行此操作,而不是文字:

var id = "John",
    reg = new RegExp(id+"$");

alert( reg.test("blahJon") );

也就是说,如果您在运行前不知道要测试的值。 否则你可以这样做:

alert( /John$/.test("blahJohn") );

我喜欢@lonesomeday 的解决方案,但我喜欢在这些场景中扩展 String.prototype。 这是我对他的解决方案的改编

String.prototype.endsWith = function (needle) {
     return needle === this.substr(0 - needle.length);
}

所以可以检查

if(myStr.endsWith("test")) // Do awesome things here. 

可口...

var id = "John";

(new RegExp(`${id}$`)).test('blahJohn');  // true
(new RegExp(`${id}$`)).test('blahJohna'); // false

`${id}$` 是一个 JavaScript 模板字符串,将被编译为 'John$'。

RegExp 中 John 之后的$代表字符串结尾,因此被测试的字符串必须在 id 值(即 John)之后没有任何内容才能通过测试。

new RegExp(`${id}$`) - 将其编译为/John$/ (所以如果 id 不应该是动态的,你可以只使用 /John$/ 而不是 new RegExp(`${id}$`) )

尝试这个 -

var reg = "/" + id + "$/";
var exists  ="blahJohn".match(reg);

更好的方法是使用RegExp.test

(new RegExp(id + '$')).test('blahJohn'); // true
(new RegExp(id + '$')).test('blahJohnblah'); // false

更好的是构建一个像这样的简单函数:

function strEndsWith (haystack, needle) {
    return needle === haystack.substr(0 - needle.length);
}

strEndsWith('blahJohn', id); // true
strEndsWith('blahJohnblah', id); // false

如果您需要它来替换功能,请考虑以下 regExp:

var eventStr = "Hello% World%";

eventStr = eventStr.replace(/[\%]$/, "").replace(/^[\%]/, ""); // replace eds with, and also start with %.

//输出:eventStr = "Hello% World";

var id = new RegExp("John");
var exists  ="blahJohn".match(id);
alert(exists);

尝试这个

为什么使用正则表达式? 它的价格昂贵。

function EndsWith( givenStr, subst )
{
var ln = givenStr.length;
var idx = ln-subst.length;
return ( giventStr.subst(idx)==subst );
}

更容易和更具成本效益,是吗?

2022 年,ECMA 11

刚刚创建了这个辅助函数,我发现它比修改正则表达式并每次都重新创建一个更有用和更干净。

/**
 * @param {string} str 
 * @param {RegExp} search 
 * @returns {boolean}
 */
function regexEndsWith (str, search, {caseSensitive = true} = {})
{
    var source = search.source
    if (!source.endsWith('$')) source = source + '$'
    var flags = search.flags
    if (!caseSensitive && !flags.includes('i')) flags += 'i'
    var reg = new RegExp(source, flags)
    return reg.test(str)
}

以这种方式使用它:

regexEndsWith('can you Fi    nD me?', /fi.*nd me?/, {caseSensitive: false})

这是一个使用正则表达式的字符串原型函数。 您可以使用它来检查是否有任何字符串对象以特定的字符串值结尾:

原型功能:

String.prototype.endsWith = function (endString) {
    if(this && this.length) {
        result = new RegExp(endString + '$').test(this);
        return result;
    }
    return false;
} 

示例用法:

var s1 = "My String";
s1.endsWith("ring"); // returns true;
s1.endsWith("deez"); //returns false;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM