正则表达式无法获取价值

时间:2018-11-22 06:44:57

标签: javascript node.js regex

我在node.js版本8.9.4上运行以下javascript代码:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:layout_scrollFlags="scroll"
            app:popupTheme="@style/AppTheme.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <android.support.v4.widget.NestedScrollView
            android:fillViewport="true"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <include layout="@layout/content_main" />

        </android.support.v4.widget.NestedScrollView>

    </LinearLayout>

</android.support.design.widget.CoordinatorLayout>

问题是正则表达式测试返回true,但是if (/^PROBLEM_(\d+)_YES_(\d+)_$/.test('PROBLEM_5_YES_1_')) { console.log("Start"); //Start console.log(RegExp.$2); // console.log(RegExp.$1); // console.log("Printed"); //Printed }RegExp.$1都为空。值未捕获。 我在做什么错了?

1 个答案:

答案 0 :(得分:0)

RegExp.$1-$9属性为non-standard-正如MDN所说:

  

非标准

     

此功能不是标准功能,也不在标准轨道上。请勿在面向Web的生产站点上使用它:它不适用于每个用户。实现之间也可能存在很大的不兼容性,并且将来的行为可能会发生变化。

因此,在某些实现中不起作用也就不足为奇了。

RegExp指的是 global 正则表达式对象,这当然与您刚刚执行的测试不同。如果要使用匹配结果,则应在字符串上使用.match方法(或在模式上使用exec),并使用结果匹配对象的标记(带有括号和数字索引):

const input = 'PROBLEM_5_YES_1_';
const match = input.match(/^PROBLEM_(\d+)_YES_(\d+)_$/);
if (match) {
  console.log(match[1]);
  console.log(match[2]);
}

在Javascript中,美元符号后跟数字仅在替换函数中具有含义,例如,$1将被捕获的第一个组替换:

console.log(
  'foo bar'.replace(/(foo) (bar)/, '$2 $1')
);