Java 捕获字符串上匹配字符(单个或重复)之间的所有字符

Java 捕获字符串上匹配字符(单个或重复)之间的所有字符,java,regex,string,pattern-matching,string-matching,Java,Regex,String,Pattern Matching,String Matching,我正在尝试提取特定字符前面的字符串(即使字符重复,如以下所示(即:下划线“\”): 在运行正则表达式之后,我应该得到这个(正则表达式应该忽略字符串中间的匹配字符的任何实例): 换句话说,我正在尝试“修剪”字符串开头和结尾的匹配字符。 我正试图使用Java中的正则表达式来实现这一点,我的想法是捕获行尾或行首的特殊字符之间的字符组 到目前为止,我只能使用此regexp成功完成示例3: /[^_]+|_+(.*)[_$]+|_$+/ [^_]+ not 'underscore' once or mo

我正在尝试提取特定字符前面的字符串(即使字符重复,如以下所示(即:下划线“\”):

在运行正则表达式之后,我应该得到这个(正则表达式应该忽略字符串中间的匹配字符的任何实例):

换句话说,我正在尝试“修剪”字符串开头和结尾的匹配字符。

我正试图使用Java中的正则表达式来实现这一点,我的想法是捕获行尾或行首的特殊字符之间的字符组

到目前为止,我只能使用此regexp成功完成示例3:

/[^_]+|_+(.*)[_$]+|_$+/

[^_]+ not 'underscore' once or more 
| OR 
_+ underscore once or more
(.*) capture all characters
[_$]+ not 'underscore' once or more followed by end of line
 |_$+ OR 'underscore' once or more followed by end of line
我刚刚意识到,这排除了示例0,1,2中消息的第一个单词,因为字符串不是以下划线开头的,而是在找到下划线后才开始匹配

有没有更简单的方法不涉及正则表达式? 我真的不在乎第一个字符(尽管这会很好),我只需要忽略结尾处的重复字符..看起来()只要这样做就行了?
/()+$/
空括号在一行末尾的单个匹配或重复匹配之前匹配任何内容..这是正确的吗


谢谢!

这里有两个选项,您可以用空字符串替换匹配的
^+|u+$
,或者从匹配的
^.*(*)中提取第一个捕获组的内容_*$
。请注意,如果您的字符串可能是多行的,并且您希望在每一行上执行替换,则您需要使用
模式。多行
标志用于任何一种方法。如果您的字符串可能是多行的,并且您只希望在最开始和结束时进行替换,请不要使用
模式。多行
但第二种方法使用
Pattern.DOTALL


例如:

这里有两个选项,您可以用空字符串替换匹配的
^+|u+$
,或者从匹配的
^.*(*)中提取第一个捕获组的内容_*$
。请注意,如果您的字符串可能是多行的,并且您希望在每一行上执行替换,则您需要使用
模式。多行
标志用于任何一种方法。如果您的字符串可能是多行的,并且您只希望在最开始和结束时进行替换,请不要使用
模式。多行
但第二种方法使用
Pattern.DOTALL

例如:

如何
[^\n\r](.*[^\n\r])?

演示

输出:

this_is_my_example_line_0
this_is_my_example_line_1
this_is_my_example_line_2
this_is_my_ _example_line_3
this_is_my___example_line_4
怎么样
[^\n\r](.[^\n\r])?

演示

输出:

this_is_my_example_line_0
this_is_my_example_line_1
this_is_my_example_line_2
this_is_my_ _example_line_3
this_is_my___example_line_4

澄清一下,你是不是想从字符串的开头和结尾删掉所有的下划线?澄清一下,你是不是想从字符串的开头和结尾删掉所有的下划线?你是在使用Java吗?嗯,我想知道我尝试的正则表达式测试程序是否不正确…因为根据你的正则表达式,省略了每个senteceohh的第一个字符匹配得很好,但它们显示的组不正确。.我认为它们是错误的@david如果要将整个匹配项放入第一组,则需要用括号括住正则表达式,如
([^\n\r](.[^\n\r]))
。在Java中,您可以使用组0进行完整匹配。@david从我看到的情况来看,如果您想在中使用完整匹配,那么您需要使用
$&
而不是
$1
您在使用Java吗?我想知道我尝试的正则表达式测试程序是否不正确……因为根据您的正则表达式,每个句子的第一个字符都被省略了hh它匹配得很好,但它们显示的组是不正确的..我认为它们是错误的@david如果你想将整个匹配放在第一组中,你需要用括号括住正则表达式,如
([^\n\r](.[^\n\r])?)在爪哇中,你可以使用组0来完成整个匹配。@戴维从我所看到的,如果你想使用整个匹配,那么你需要使用<代码> $和<代码>而不是<代码> $1 < /Cord> OHH,使正则表达式^ ~*(**)~*$工作的关键是中间的懒惰匹配,所以ReGEX ~*$的结尾部分将能够捕获其余的!!)Orh,使正则表达式^ ~*(**)~*$工作的关键是中间的惰性匹配!因此,regex~*$的结尾部分将能够捕获其余部分:)
String data=
        "this_is_my_example_line_0\n" +
        "this_is_my_example_line_1_\n" +
        "this_is_my_example_line_2___\n" +
        "_this_is_my_ _example_line_3_\n" +
        "__this_is_my___example_line_4__";

Pattern p=Pattern.compile("[^_\n\r](.*[^_\n\r])?");
Matcher m=p.matcher(data);
while(m.find()){
    System.out.println(m.group());
}
this_is_my_example_line_0
this_is_my_example_line_1
this_is_my_example_line_2
this_is_my_ _example_line_3
this_is_my___example_line_4