一个能识别/*...*/注释的正则表达式

时间:2016-05-10 16:55:35

标签: java regex kotlin

我有一个包含/*...*/笔记的字符串,我试图摆脱它们。例如:

Hello /* this is a note */

所以基本上我试图想出一个正则表达式,它会找到/然后是任何类型字符的序列,然后是另一个/。我试过这个:

("/+(\\w|\\W)*+/").toRegex()

......但它没有用。

5 个答案:

答案 0 :(得分:1)

您必须转义特殊字符

 /(\/\*.+?\*\/)/

http://regexr.com/3dd28

答案 1 :(得分:1)

尝试此模式(也允许/* .. */之间的多行)

编辑:根据 mszymborski 建议。

(\/\*[\w\'\s\r\n\*]*\*\/)|(\/\*.*?\*\/)

<强> regex101 DEMO

enter image description here

答案 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代码)就是为此编写自己的解析器。