Javascript 正则表达式:搜索字符仍然不完美

Javascript 正则表达式:搜索字符仍然不完美,javascript,regex,Javascript,Regex,我有以下代码: <script type="text/javascript"> var str="KD-R35H2UND"; var patt1=/[G|T|EE|EJU].*D/i; document.write(str.match(patt1)); </script> 我的问题是:如果我键入KD-R35GD它可以显示GD,但是如果KD-R35D它什么都不能显示..如何使它工作?b*意味着“匹配零次或多次出现的b” 表示“匹配除换行符以外的任何字符” [EE|EJU]

我有以下代码:

<script type="text/javascript">
var str="KD-R35H2UND";
var patt1=/[G|T|EE|EJU].*D/i;
document.write(str.match(patt1));
</script>
我的问题是:如果我键入
KD-R35GD
它可以显示
GD
,但是如果
KD-R35D
它什么都不能显示..如何使它工作?

b*
意味着“匹配零次或多次出现的
b

表示“匹配除换行符以外的任何字符”

[EE|EJU]
表示“匹配
E
、a
、a
J
或a
U

*
表示“匹配除换行符以外的任何字符零次或多次”

D
表示“匹配a
D

所以正则表达式正在做你要求它做的事情

根据您在问题中提供的示例,我猜实际规则应该是:

  • 字符串以
    KD-R35
    开头
  • 然后,可以跟随任意数量的字母数字字符,只要
  • 其中有一个
    E
    、一个
    J
    或一个
    U
    ,以及
  • 字符串以
    D
    结尾
  • 这些规则作为正则表达式,如下所示:

    ^         # start of string
    KD-R35    # literal text
    (         # start of capturing group
      \w*     # any number of alphanumeric characters
      [EJU]   # at least one of E, J, or U
      \w*     # any number of alphanumeric characters
      D       # a D
    )         # end of capturing group
    $         # end of string
    
    或者,在JavaScript中:

    match = subject.match(/^KD-R35(\w*[EJU]\w*D)$/i);
    if (match != null) {  // successful match
        mytext = match[1] // capturing group 1
    } else {
        // Match attempt failed
    }
    
    我假设大小写不重要


    编辑:呃,您的新编辑更改了规则。似乎任何字符串都是允许的,只要它以
    KD-R35
    开头,以
    D
    结尾。在这种情况下,正则表达式应该是
    /^KD-R35(\w*D)$/i

    字符串的第一部分(KD-R35)是否与要验证的字符串的所有实例相同(或至少格式相同)

    你能写一个字符串示例列表和正则表达式匹配后你想要的提取吗

    例如:

    • KD-R35HASDF=>HASDF
    • KD-R35H1234=>H1234
    • KD-R35HASDA=>HASDA
    • KD-R35HG54G=>HG54G
    • KD-R35HD23D=>HD23D
    如果是这种情况,此正则表达式可能会有所帮助:

    .{2}\-.{3}(.*)

    意思是:

  • 任意字符2次
  • 减号
  • 任意字符3次
  • 捕获-任意字符任意次数
  • HTML:

    
    var str1=“KD-R35HASDF”;
    var str2=“KD-R35H1234”;
    var str3=“KD-R35HASDA”;
    var str4=“KD-R35HG54G”;
    var str5=“KD-R35HD23D”;
    var patt1=/.{2}\-.{3}(.*)/;
    document.write(str1.match(patt1)[1]+“
    ”; document.write(str2.match(patt1)[1]+“
    ”; 文件写入(str3.match(patt1)[1]+“
    ”; 文件写入(str4.match(patt1)[1]+“
    ”; 文件写入(str5.match(patt1)[1]+“
    ”;
    请注意,str5.match(patt1)返回一个数组,因此使用第二个元素如下:

    if i type KD-R35ED => SHOW ED
    KD-R35UND => UND
    KD-R35JD => JD
    KD-R35TJD => TJD
    KD-R35EED=> EED
    
    str5.match(patt1)[1]

    您将得到您要查找的结果

    
    
    <script type="text/javascript">
    var str="KD-R35H2UND";
    var patt1=/.{2}-.{3}(.*)/;
    document.write(str.match(patt1));
    </script>
    
    var str=“KD-R35H2UND”; var patt1=/.{2}-.{3}(.*)/; 记录(str.match(patt1));

    我改为这一部分,但显示了KD-R35H2UND,H2UND

    您试图用正则表达式做什么-特别是这一部分
    [EE|EJU]
    -详细说明输入格式和匹配条件,并发布两个接受和拒绝的字符串。@klox:该输出非常适合模式的功能。显然这不是您想要的,所以您需要清楚地告诉正则表达式引擎您想要什么。如果你不能做到这一点,那么你需要清楚地告诉我们你想要什么,这样我们就可以告诉你要告诉引擎什么,你清楚地想要什么。这显然是我想要的。问题仍然不是perfect@all:我已经在更改我的问题,请再次检查并假设您的所有输入不会以KD-R35开头?“因为如果它是/KD-R35(.*)/就是您想要的正则表达式。如果它不总是以KD-R35开头,或者如果有尾随信息,请发布一个数据格式的描述。应该是
    {2}-.{3}(.*)
    ,他想要在
    KD-R35
    之后的所有内容。它返回一个数组,你需要使用>str1.match(patt1)[1]我不明白
    match[0]
    包含整个字符串(“KD-R35H2UND”),
    match[1]
    包含变量部分(“H2UND”)。如果前面有
    KD-R35
    ,则不可能只匹配
    H2UND
    ,因为JavaScript不支持查找断言。毕竟可以工作,我发现了另一个问题..请检查我的问题。。
    <script type="text/javascript">
    var str="KD-R35H2UND";
    var patt1=/.{2}-.{3}(.*)/;
    document.write(str.match(patt1));
    </script>