仅在某些情况下,我试图用定界符分割字符串。 更具体地说,我想拆分split语句的条件。 我希望能够拆分
"disorder == 1 or ( x < 100)"
进入
"disorder == 1"
"(x < 100)"
如果我使用split("or")
,我也会在disorder
内部产生分裂:
"dis"
"der == 1"
"( x < 100)"
如果我尝试使用split("[ )]or[( ]")
之类的正则表达式,则会丢失( x < 100)
中的括号:
"disorder == 1"
"x < 100)"
我正在寻找一种仅在分隔符被空格或括号包围时才拆分字符串的方法,但是我想保持周围环境。
答案 0 :(得分:3)
正如评论中指出的片状一样,您可以使用word boundary character。
元字符\ b是锚号,如插入符号和美元符号。它在称为“单词边界”的位置匹配。 此匹配长度为零。
String x = "disorder == 1 or( x < 100)";
for(String s : x.split("\\bor\\b"))
System.out.println(s);
结果:
障碍== 1
(x <100)
有关使用向前/向后查找的解决方案,请参见Kevins的最佳答案。
答案 1 :(得分:2)
您想将Lookaheads和Lookbehinds用于空格/括号,所以类似这样:
String input = "disorder == 1 or( x < 100)";
String[] split = input.split("(?<=[ )])or(?=[ (])");
[ )]
和[ (]
的意思是看空格或括号。当然,可以将其替换为任何其他边界字符,甚至是文字正则表达式边界\\b
。(?<=...)
令人反感。因此,只有当or
前面有空格或)
时,它才会匹配,但不会在拆分后将其删除。(?=...)
是超前的。因此,它仅匹配or
,后跟一个空格或(
,但不与拆分一起删除它们。答案 2 :(得分:1)
我不完全确定您为此目的是什么:所提供的示例以某种方式提供了您要执行的操作以及要执行的操作的很小的视图。如果我错了,请纠正我,但似乎您想解析某种编程语言的任意表达式。
通常,您无法以这种简单的方式来处理类似的事情。这是一个表达。它具有层次结构。一般而言,由于RegEx无法使用此分层结构,因此通常无法在这里进行简单的拆分-甚至不能使用RegEx进行拆分。
要正确执行此操作,您需要在某种程度上解析。通过将表达式拆分为简单的标记,在(简单的)树数据模型中重建层次结构,然后您可以按任意方式对其进行分析来完成此操作。实际上,您可以使用RegEx来识别各个令牌,但是在使用它之前,需要先构建一个树状数据结构。
构建这种树状结构并不是一件容易的事,因为您必须考虑表达式中各种运算符的优先级。但是如果(!)您有一个非常特定的应用领域-f.e.一个结构非常有限的表达式列表-您也许可以直接使用令牌列表。
这是此令牌化过程的一个示例。您的字符序列disorder == 1 or( x < 100)
可能会解析为一些令牌序列,例如:
现在,您可以识别单词“或”并按所需方式处理该表达式。
然后,诀窍将是执行合理的标记化。为此,我建议定义一组正则表达式,每个正则表达式都可以识别数字,单词或某些运算符或括号。通过使用每个正则表达式查看下一个字符来处理每个字符串,并尝试将这些字符与这些正则表达式进行匹配。如果有匹配项,则发出找到的令牌,然后在匹配后前进到字符序列中的位置,然后继续其余的字符序列。
如果您能够通过字符序列(并发出令牌),则说明解析成功完成。如果您未通过提供的所有单个RegExes失败,则输入数据中存在一些语法问题。令牌化后,您可以根据需要进一步使用令牌。
答案 3 :(得分:0)
看起来您需要有一个更复杂的正则表达式,其中单词“或”加上单个前后字符不是字母。例如:
((.+)+(\Wor\W)+)+
类似这样的情况,您可以在其中识别字符的模式,一个单独的非单词字符,文字单词“或”以及另一个单独的非单词字符。这可能不是您所需要的确切形式,但是与此类似的捕捉模式的内容可能会为您服务。
答案 4 :(得分:0)
您可以将或替换为字符串中没有的任何其他字符,然后由该字符拆分。
例如:
Sub Test()
Dim Arr1: Arr1 = Array("JUL", "JUN", "MAY", "APR", "MAR", "FEB")
Dim Arr2: Arr2 = Array("AUG", "JUL", "JUN", "MAY", "APR", "MAR")
Dim i As Long
With ThisWorkbook.Sheets("Sheet1").Range("D:D")
For i = LBound(Arr1) To UBound(Arr2)
.Replace What:=Arr1(i), Replacement:=Arr2(i), LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Next i
End With
End Sub