我有一个包含/*...*/
笔记的字符串,我试图摆脱它们。例如:
Hello /* this is a note */
所以基本上我试图想出一个正则表达式,它会找到/
然后是任何类型字符的序列,然后是另一个/
。我试过这个:
("/+(\\w|\\W)*+/").toRegex()
......但它没有用。
答案 0 :(得分:1)
答案 1 :(得分:1)
尝试此模式(也允许/* .. */
之间的多行):
编辑:根据 mszymborski 建议。
(\/\*[\w\'\s\r\n\*]*\*\/)|(\/\*.*?\*\/)
<强> regex101 DEMO 强>
答案 2 :(得分:1)
*+
为possessive,因此(\w|\W)*+
会一直匹配到字符串末尾,并拒绝退出以使最终/
匹配。我想你的意思是:
"(?s)/.*?/"`
(?s)
启用DOTALL模式,允许.
匹配换行符;这比(\w|\W)
更有效率。 ?
使.*
非贪婪,因此它会在下一个/
停止。但是,我想你可能想要这个:
"(?s)/\\*.*?\\*/"
我不知道您匹配哪种文字,但如果它是一种编程语言,*
很可能是评论分隔符的一部分,而/
1}}本身有其独特的含义。
答案 3 :(得分:0)
不确定您要实现的目标,但这里有一个匹配MenuItem.setSelected(true)
评论的正则表达式:@Override
public void onCreate()
{
// ...
// mTabLayout and mViewPager are created properly.
mTabLayout.setOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mViewPager)
{
@Override
public void onTabSelected(TabLayout.Tab tab)
{
super.onTabSelected(tab);
updateNavigationViewSelection();
}
});
}
@Override
public void onResume()
{
// ...
// To set correct NavigationView when resuming. Actually works ok at startup.
updateNavigationViewSelection();
}
public void updateNavigationViewSelection()
{
int currentItem = mViewPager.getCurrentItem();
selectNavigationMenuItem(currentItem);
}
public void selectNavigationMenuItem(int tab)
{
MenuItem menuItem = null;
NavigationView navigationView = (NavigationView) findViewById(R.id.my_navigationview);
switch (tab)
{
case TAB1:
menuItem = getNavigationMenuItemTab1();
break;
case TAB2:
menuItem = getNavigationMenuItemTab2();
break;
}
if (menuItem != null)
{
unselectAllNavigationMenuItems(); // Calls setChecked(false) on all MenuItems, may be commented out for testing.
// We arrive here, from onTabSelected(), onResume() and onNavigationItemSelected().
// onResume() sets the color correctly, as does onNavigationItemSelected(),
// but *not* when calling from onTabSelected(). All the values seem to be correct, but nothing happens.
// It seems that checked is set to true, but there is some invalidation missing.
// Invalidating NavigationView or DrawerLayout does nothing.
menuItem.setChecked(true);
}
}
@Override
public boolean onNavigationItemSelected(MenuItem menuItem)
{
switch (menuItem.getItemId())
{
case R.id.my_navigationview_tab1:
selectNavigationMenuItem(TAB1);
// Close drawer.
return true;
case R.id.my_navigationview_tab2:
selectNavigationMenuItem(TAB2);
// Close drawer.
return true;
default:
return false;
}
}
@Nullable
private MenuItem getNavigationMenuItemTab1()
{
MenuItem navigationMenu = getNavigationMenu();
return navigationMenu == null ? null : navigationMenu.getSubMenu().findItem(R.id.my_navigationview_tab1);
}
@Nullable
private MenuItem getNavigationMenuItemTab2()
{
MenuItem navigationMenu = getNavigationMenu();
return navigationMenu == null ? null : navigationMenu.getSubMenu().findItem(R.id.my_navigationview_tab2);
}
@Nullable
private MenuItem getNavigationMenu()
{
NavigationView navigationView = (NavigationView) findViewById(R.id.my_navigationview);
return navigationView == null ? null : navigationView.getMenu().findItem(R.id.navigation_menu);
}
private void unselectAllNavigationMenuItems()
{
MenuItem item;
item = getNavigationMenuItemTab1();
if (item != null)
item.setChecked(false);
item = getNavigationMenuItemTab2();
if (item != null)
item.setChecked(false);
}
使用此网站查找和调试解决方案http://regexr.com/
答案 4 :(得分:0)
不幸的是,由于它们不支持递归模式,因此无法正确匹配/* .. */
语法与Java / Kotlin RegEx。
有问题的测试用例是:
/*
/* ... */
*/
Kotlin编译器会将上面的代码解析为两个嵌套注释块。
为任意级别的嵌套块实现这一目标的唯一方法是使用名为&#34;正则表达式递归的技术#34;。如此处所述,Java Java regex library with recursion support不支持它。
我在这里看到的唯一解决方案(如果你确实需要正确解析任何 Kotlin代码)就是为此编写自己的解析器。