gpt4 book ai didi

java - 模式匹配错误

转载 作者:行者123 更新时间:2023-11-29 20:13:22 24 4
gpt4 key购买 nike

我在调用静态方法时发现了 Android 中的一个错误。

Pattern.matches(String pattern, String value)

这是错误的详细信息:

let parameter pattern = "^[a-zA-Z0-9]([\\-a-zA-Z0-9_\\u4e00-\\u9fa5]*)+";

let value to be a long string containing symbol "@" (in the end will crash almost every time), for example "Abcjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj@";

call Pattern.matches(pattern, value);

这个方法卡住了,不返回任何东西。

if input string is short like "Abc@", it's fine and return false.

if input a short string like "Abc@", then continue to make the string longer like "Abc@jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj@, it's fine and return false.

在我的应用程序中,当我在 EditText 中执行此操作并单击按钮来执行 Pattern.mathes(模式,值)时。UI 将不会响应,然后应用程序将崩溃。

当我想过滤用户的输入时,我在工作中发现了这个错误,然后我在我自己的应用程序中编写了一个简单的测试用例来重现这个错误(参见 btnTestInput() 方法),这是我的应用程序代码。

这是 mainActivity XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.tyouter.timecat.ui.activity.MainActivity"
android:orientation="vertical">

<EditText
android:id="@+id/edtTestInputFilter"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="none" />

<Button
android:id="@+id/btnTestInput"
android:text="@string/activity_main_test_input_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>

这是mainActivity.class:

@EActivity(R.layout.activity_main)
@OptionsMenu(R.menu.menu_main)
public class MainActivity extends BaseActivity {

@ViewById
EditText edtTestInputFilter;

@ViewById
Button btnTestInput;

@Bean
MainController controller;

MainAdapter adapter;

@AfterViews
void init() {
TimeCatApplication.BUS.register(this);
}

@OptionsItem
void menuSettings() {

}

@OptionsItem
void menuAbout() {
controller.onMenuAboutClicked(this);
}

@Subscribe(threadMode = ThreadMode.MainThread)
public void onEventMainThread(TestEventBusEvent event) {
T.showLong(this, getResources().getString(R.string.test_event_success));
}

@Override
protected void initVariables() {

}

@Override
protected void initViews(Bundle savedInstance) {

}

@Override
protected void loadData() {

}

@Click
void btnTestInput() {
if (InputFilter.projectNameMatches(getTest())) {
T.showLong(this, "pass");
}else {
T.showLong(this, "fail");
}
}

private String getTest() {
return edtTestInputFilter.getText().toString();
}
}

这是 InputFilter.class:

public class InputFilter {
static String mProjectName = "^[a-zA-Z0-9]([\\-a-zA-Z0-9_\\u4e00-\\u9fa5]*)+";

public static boolean matches(String pattern, String value) {
return Pattern.matches(pattern, value);
}

public static boolean projectNameMatches(String projectName) {
return matches(mProjectName, projectName);
}
}

我的 Java 版本:1.8.0_51。

我的 Android 构建工具和 sdk:23.0.1 23.

最佳答案

这不是错误,它是 catastrophic backtracking .您的模式中有嵌套量词。改成

String pattern = "[a-zA-Z0-9][-a-zA-Z0-9_\\u4e00-\\u9fa5]*";

您不需要模式中的第一个 ^,因为您在需要整个字符串匹配模式的 matches 方法中使用它。

关于java - 模式匹配错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34438366/

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