我在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
都为空。值未捕获。
我在做什么错了?
答案 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')
);