Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java正则表达式_Java_Regex_Text - Fatal编程技术网

Java正则表达式

Java正则表达式,java,regex,text,Java,Regex,Text,你好 我有以下语法: @AAAA{tralala10aa, author = {Some Author}, title = {Some Title}, booktitle = {Some Booktitle}, year = {2010}, month = {March}, booktitle_short = {CC 2010}, conference_url = {http://www.mmmm.com}, projects = {projects} } 我

你好

我有以下语法:

@AAAA{tralala10aa,
  author = {Some Author},
  title = {Some Title},
  booktitle = {Some Booktitle},
  year = {2010},
  month = {March},
  booktitle_short = {CC 2010},
  conference_url = {http://www.mmmm.com},
  projects = {projects}
}

我创建了以下正则表达式:

@[A-Z]*[{][a-z0-9]*[,]

但我需要整个文本块。我该怎么做呢?

在这种情况下,使用上下文无关语法而不是正则表达式似乎会更好。考虑使用分析器生成器,例如OR。/P>> P>,在这种情况下,使用上下文无关文法代替正则表达式会更好。如果使用括号中的嵌套只允许一个深:

,请考虑使用分析器生成器,如OR./P>>P>。
/@[A-Z]*{([^{}]*+|{[^{}]*+})*}/
注意所有格量词的使用*+-如果没有它,在失败的匹配中可能需要相当长的时间


我不确定Java是否支持它-如果不支持,请将其删除,但请记住错误行为。

如果大括号上的嵌套只允许一个深度:

/@[A-Z]*{([^{}]*+|{[^{}]*+})*}/
注意所有格量词的使用*+-如果没有它,在失败的匹配中可能需要相当长的时间


我不确定Java是否支持它-如果不支持,请删除它,但请记住失败行为很差。

我不会使用正则表达式,我会标记字符串并建立字典。抱歉,这是Python实现,不是Java:

>>> s ="""@AAAA{tralala10aa,
  author = {Some Author},
  title = {Some Title},
  booktitle = {Some Booktitle},
  year = {2010},
  month = {March},
  booktitle_short = {CC 2010},
  conference_url = {http://www.mmmm.com},
  projects = {projects}
}"""
>>> 
>>> s
'@AAAA{tralala10aa,\n  author = {Some Author},\n  title = {Some Title},\n  booktitle = {Some Booktitle},\n  year = {2010},\n  month = {March},\n  booktitle_short = {CC 2010},\n  conference_url = {http://www.mmmm.com},\n  projects = {projects}\n}'
>>> 
>>> 
>>> lst = s.replace('@AAA', '').replace('{', '').replace('}', '').split(',\n')
>>> lst
['Atralala10aa', '  author = Some Author', '  title = Some Title', '  booktitle = Some Booktitle', '  year = 2010', '  month = March', '  booktitle_short = CC 2010', '  conference_url = http://www.mmmm.com', '  projects = projects\n']
>>> dct = dict((x[0].strip(), x[1].strip()) for x in (y.split('=') for y in lst[1:]))
>>> dct
{'booktitle_short': 'CC 2010', 'title': 'Some Title', 'booktitle': 'Some Booktitle', 'author': 'Some Author', 'month': 'March', 'conference_url': 'http://www.mmmm.com', 'year': '2010', 'projects': 'projects'}
>>> 
>>> dct['title']
'Some Title'
>>> 

希望上面的代码看起来是不言自明的。

我不会使用正则表达式,我会标记字符串并建立字典。抱歉,这是Python实现,不是Java:

>>> s ="""@AAAA{tralala10aa,
  author = {Some Author},
  title = {Some Title},
  booktitle = {Some Booktitle},
  year = {2010},
  month = {March},
  booktitle_short = {CC 2010},
  conference_url = {http://www.mmmm.com},
  projects = {projects}
}"""
>>> 
>>> s
'@AAAA{tralala10aa,\n  author = {Some Author},\n  title = {Some Title},\n  booktitle = {Some Booktitle},\n  year = {2010},\n  month = {March},\n  booktitle_short = {CC 2010},\n  conference_url = {http://www.mmmm.com},\n  projects = {projects}\n}'
>>> 
>>> 
>>> lst = s.replace('@AAA', '').replace('{', '').replace('}', '').split(',\n')
>>> lst
['Atralala10aa', '  author = Some Author', '  title = Some Title', '  booktitle = Some Booktitle', '  year = 2010', '  month = March', '  booktitle_short = CC 2010', '  conference_url = http://www.mmmm.com', '  projects = projects\n']
>>> dct = dict((x[0].strip(), x[1].strip()) for x in (y.split('=') for y in lst[1:]))
>>> dct
{'booktitle_short': 'CC 2010', 'title': 'Some Title', 'booktitle': 'Some Booktitle', 'author': 'Some Author', 'month': 'March', 'conference_url': 'http://www.mmmm.com', 'year': '2010', 'projects': 'projects'}
>>> 
>>> dct['title']
'Some Title'
>>> 

希望上面的代码看起来是不言自明的。

如果块总是以一个单独的右括号结束,那么这可能会做到:

"(?ms)@[A-Z]+\\{.+?^\\}$"
其中?ms将表达式设置为multiline和dotall,这样,+也可以匹配换行符,并且末尾的内容本身匹配一行上的右大括号


中间的问号使“+”匹配不贪婪,因此它将不匹配到和包括文件中最后一个块的所有块。

如果块总是以一个单独的闭合括号结束,那么这可能是:

"(?ms)@[A-Z]+\\{.+?^\\}$"
其中?ms将表达式设置为multiline和dotall,这样,+也可以匹配换行符,并且末尾的内容本身匹配一行上的右大括号



中间的问号使.+匹配不贪婪,它与文件中的最后一个块的所有块都不匹配。

定义整个文本块,用四个空格来编写代码是格式化它的正确方法。我有很多这样的文本块:@ AAAA{TralaL10AA,作者= {一些作者},title = {某些标题}。,bookstitle={Some bookstitle},year={2010},month={March},bookstitle\u short={CC 2010},conference\u url={},projects={projects}我需要将它们分开。两者之间可以用逗号吗?我个人不会在这里使用正则表达式。请更清楚地解释你想要实现的目标。您已经提供了一些输入数据,但尚未说明您正在尝试执行的操作。您是否试图匹配@AAAA{和}之间的所有文本?定义整个文本块将代码缩进四个空格是正确的格式化方式。我有许多这样的文本块:@AAAA{trala10aa,author={Some author},title={Some title},booktitle={Some booktitle},year={2010},month={March},booktitle_short={CC 2010},conference_url={},projects={projects}我需要将它们分开。两者之间可以用逗号吗?我个人不会在这里使用正则表达式。请更清楚地解释你想要实现的目标。您已经提供了一些输入数据,但尚未说明您正在尝试执行的操作。您是否正在尝试匹配@AAAA{and}之间的所有文本?将所有文本与@AAA{some text}进行匹配并不容易?我不知道如何表达:一些文本,在结尾}我认为Anon的正则表达式将获得文本,但只有当嵌套的大括号有一个深度时。CFG还可以方便地解析块内的各个语句。如果要匹配多个嵌套级别,可以有三种选择:将正则表达式扩展到那些更深的级别(假设深度有限),使用递归的非正则表达式Perl有这些,不知道Java,或者使用一个合适的parser.Grats对所有的upvots进行分析,但似乎我找到了一个满足要求的简单regexp;用@AAA{some text}匹配所有内容不是件容易的事吗?我不知道如何表达:一些文本,在结尾}我认为Anon的正则表达式将获得文本,但只有当嵌套的大括号有一个深度时。CFG还可以方便地解析块内的各个语句。如果要匹配多个嵌套级别,可以有三种选择:将正则表达式扩展到那些更深的级别(假设深度有限),使用递归的非正则表达式Perl有这些,不知道Java,或者使用一个合适的parser.Grats对所有的upvots进行分析,但似乎我找到了一个满足要求的简单regexp-1-这并不能清楚地回答这个特定于Java的问题。不过,这是一个比使用regexp更好的解决方案。@quant\u de

v-如果您认为字典是解决问题的更好方法,请用Java编写解决方案,并将其作为您自己的答案发布。-1-这并没有明确回答这个特定于Java的问题。不过,这是一个比使用regexp更好的解决方案。@quant_dev-如果您认为字典是解决问题的更好方法,用Java编写解决方案代码并将其作为您自己的答案发布。此表达式或答案文本中是否有任何内容使此表达式具有多行功能?您不需要前导和尾随斜杠,Java中的正则表达式构造函数只接受一个常规字符串,因此有些情况下您必须进行双转义,但在本例中不需要。另外,它也支持所有格量词,所以不会有问题。Java正则表达式中的[^{}]会默认匹配换行符吗?如果不是,则需要指定单线属性。@Anon:我不这么认为。这就是我问的原因。在这个表达式或答案文本中是否有任何东西使这个表达式能够多行?您不需要前导和尾随斜杠,Java中的正则表达式构造函数只需要一个常规字符串,因此在某些情况下您必须进行双转义,但在这种情况下不需要。另外,它也支持所有格量词,所以不会有问题。Java正则表达式中的[^{}]会默认匹配换行符吗?如果不是,则需要指定单线属性。@Anon:我不这么认为。这就是我问的原因。它不起作用。当我有更多的块时,它将所有块都匹配为一个。哦,对不起!我刚刚纠正了我表达中的一个错误。请再试一次!杰出的谢谢你的反馈,我一直在这里啃指甲,不起作用。当我有更多的块时,它将所有块都匹配为一个。哦,对不起!我刚刚纠正了我表达中的一个错误。请再试一次!杰出的谢谢你的反馈,我一直在这里啃指甲。