gpt4 book ai didi

javascript - 捕获正则表达式灾难性回溯 Node.js

转载 作者:行者123 更新时间:2023-11-30 20:39:55 25 4
gpt4 key购买 nike

我的 node.js 脚本中有这个正则表达式:

const commentPattern = new RegExp(
'(\\/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*+/)|(//.*)',
'g'
);

我用它来从开源 Java 项目中提取注释。

我发现某些提交会停止我的脚本。这是由于“灾难性回溯”造成的,我一直在寻找一种方法来捕获或阻止它,以便即使在这种情况下我的代码也能继续运行。

这是阻止脚本执行的代码示例:

import android.content.res.Resources;
import android.os.Handler;
import android.preference.PreferenceFragment;
import android.view.ViewGroup;
* Provides the regex to identify domain HTTP(S) protocol and/or 'www' sub-domain.
*
* Used to format user-facing {@link String}'s in certain preferences.
*/
public static final String ADDRESS_FORMAT_REGEX = "^(https?://(w{3})?|www\\.)";

/**
// Used to ensure that settings are only fetched once throughout the lifecycle of the fragment
private boolean mShouldFetch;

public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
// use a wrapper to apply the Calypso theme
Context themer = new ContextThemeWrapper(getActivity(), R.style.Calypso_SiteSettingsTheme);
LayoutInflater localInflater = inflater.cloneInContext(themer);
View view = super.onCreateView(localInflater, container, savedInstanceState);

if (view != null) {
setupPreferenceList((ListView) view.findViewById(android.R.id.list), getResources());
}

return view;
}

@Override
public void onChildViewAdded(View parent, View child) {
if (child.getId() == android.R.id.title && child instanceof TextView) {
// style preference category title views
TextView title = (TextView) child;
WPPrefUtils.layoutAsBody2(title);
} else {
// style preference title views
TextView title = (TextView) child.findViewById(android.R.id.title);
if (title != null) WPPrefUtils.layoutAsSubhead(title);
}
}

@Override
public void onChildViewRemoved(View parent, View child) {
// NOP
}

@Override

我使用的是 Node.js 8.6.0 版本,我也在 v9.8.0 上试过。

最佳答案

您无法使用一个正则表达式安全地解析代码,因此,修复灾难性回溯并不能真正解决问题。

使用一些 JavaScript 代码解析器将是正确的解决方案。

如果您对匹配注释(如字符串文字、注释等中的子字符串)没问题,您可以使用

var rx = new RegExp('/\\*[^*]*\\*+(?:[^/*][^*]*\\*+)*/|//.*', 'g')

参见 online JS regex demo .请注意,由于模式中有许多 / 字符,因此最好使用正则表达式构造函数,因此所有正则表达式转义都是使用双 \ 字符完成的。

详情

  • \*[^*]*\*+(?:[^/*][^*]*\*+)*/ - 多行匹配正则表达式 ( see description here )
  • | - 或者
  • //.* - 双斜杠,然后是换行符以外的任何 0+ 个字符。

关于javascript - 捕获正则表达式灾难性回溯 Node.js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49390452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com