Java正则表达式:由空格分隔的匹配表达式

时间:2016-01-07 15:41:15

标签: java regex

电话号码如下:

+38097-12-34-123
+380971234-123
380971234-123

我应该匹配字符串中的电话号码,假设它们用空格分隔。所以这不匹配字符串:

45+38097-12-34-123
+38097-12-34-123=TEST
my number:38097-12-34-123

没有空白分隔符要求的电话号码工作正则表达式是:

\\+?380\\d\\d(?:-?\\d){7}

我尝试使用\b / \B boundary matcher进行测试,但如果使用了前导+符号则无法进行测试。

更新我修复了示例,因为我是从内存中输入的,忘了放8符号。

UPDATE2 @Washington Guedes 您的正则表达式(我从\剥离\-):

\b(\+?\d{4}(?:-\d{2}-|\d{2})\d{2}-\d{3})\b

不起作用,因为匹配字符串中的+

bash# groovysh 
groovy:000> "45 +8097-12-34-123".matches(".*\\b(\\+?\\d{4}(?:-\\d{2}-|\\d{2})\\d{2}-\\d{3})\\b.*")
===> true
groovy:000> "45+8097-12-34-123".matches(".*\\b(\\+?\\d{4}(?:-\\d{2}-|\\d{2})\\d{2}-\\d{3})\\b.*")
===> true

我希望在+标志之前没有白人的探险失败。

@stribizhev 与您的建议相同:

groovy:000> "45+38097-12-34-123".matches(".*(?<!\\w)\\+?380\\d\\d(?:-?\\d){7}(?!\\w).*")
===> true
groovy:000> "45 +38097-12-34-123".matches(".*(?<!\\w)\\+?380\\d\\d(?:-?\\d){7}(?!\\w).*")
===> true

2 个答案:

答案 0 :(得分:1)

最后,我设法写了一个愚蠢的解决方案,检查字符串的开头或空格的提示:

groovy:000> "+38097-12-34-123".matches("(?:^|.*\\s)(\\+?380\\d\\d(?:-?\\d+){7})\\b.*")
===> true
groovy:000> "45+38097-12-34-123".matches("(?:^|.*\\s)(\\+?380\\d\\d(?:-?\\d+){7})\\b.*")
===> false
groovy:000> "45 +38097-12-34-123".matches("(?:^|.*\\s)(\\+?380\\d\\d(?:-?\\d+){7})\\b.*")
===> true
groovy:000> "45 +38097-12-34-123xxx".matches("(?:^|.*\\s)(\\+?380\\d\\d(?:-?\\d+){7})\\b.*")
===> false
groovy:000> "45 +38097-12-34-123 xxx".matches("(?:^|.*\\s)(\\+?380\\d\\d(?:-?\\d+){7})\\b.*")
===> true

最终\b可以替换为(?:\s.*|$)但是groovy shell解析器对$符号感到厌烦((没有时间深入到新问题。

答案 1 :(得分:1)

您遇到的主要困难是在可选子模式var TopicsList = React.createClass({ render: function () { return ( <div className="row"> <IndividualTopic topic_no="1"> Topic 1 </IndividualTopic> <IndividualTopic topic_no="2"> Topic 2 </IndividualTopic> <IndividualTopic topic_no="3"> Topic 3 </IndividualTopic> <IndividualTopic topic_no="4"> Topic 4 </IndividualTopic> <div className="col-sm-12"> { this.state.showTopicDescription ? <IndividualTopicPages /> : null } </div> </div> ); } }); var selected_topic_no; var IndividualTopic = React.createClass({ getInitialState: function() { return { showTopicDescription: false }; }, onClick: function() { this.setState({ showTopicDescription: true }); selected_topic_no = this.props.topic_no - 1; }, render: function () { return ( <div> <div className="col-sm-2"> <div onClick={this.onClick} className="single-topic" data-topic-no={this.props.topic_no}> {this.props.children} </div> </div> </div> ); } }); 之前使单词边界工作。使用尾随单词边界,您可以使用\+?\b(仅当您的上下文未知时才更可取,但在此处,您始终有必填数字,因此,(?!\w)是足够)。

由于回溯,\b被“狼吞虎咽”,而后备\+?仅检查第一个数字是否前面带有非单词字符。由于在(?<!\w)中,45+38097-12-34-123前面有一个非单词3,因此匹配。

解决方案可以在前瞻中使用替代方案:

+

请参阅IDEONE demo

请参阅regex demo with your input examples