簡體   English   中英

如何在數學運算符上將字符串拆分為定界符,但在引號內轉義運算符(在Java中)?

[英]How to Split a String on mathematical operators as delimiters but escape operators inside quotes (in java)?

例如,

AM2 + 'G - D08 - 28 - 14 .xlsx]General Inputs'應拆分為

AM2'G - D08 - 28 - 14 .xlsx]General Inputs'

對於給定輸入示例的類型,我可能會匹配vs拆分。

String s  = "AM2 + 'G - D08 - 28 - 14 .xlsx]General Inputs'";
Pattern p = Pattern.compile("'[^']*'|[^ '+*/-]+");
Matcher m = p.matcher(s);
while (m.find()) {
  System.out.println(m.group());
}

輸出量

AM2
'G - D08 - 28 - 14 .xlsx]General Inputs'

我認為您無法使用split進行此操作-如果可以的話,這將非常棘手且混亂。 split擅長查找定界符,但是當必須將模式應用於定界符之間的內容時, split不太好,在這種情況下會很合適。

相反,我將使用正則表達式來查找定界符之間出現的文本,並使用Matcher方法。 我這樣看待問題的方式是將非操作員文本視為一系列實體,其中每個實體都是

  • 帶引號的字符串;
  • 不是引號,也不是運算符的單個字符(如果某些運算符是兩個或多個字符,則不是運算符的開始)。

如果您所有的運算符都是一個字符,則找到“操作數”的正則表達式可能看起來像

('.*?'|[^'+\-*/])*

這表示要在引號之間查找任意數量的字符, 或者查找不是+-*/任何單個字符(請注意-必須在字符類內轉義)。 最后一個*表示尋找零個或多個該模式。

要查找一個運算符可能是多個字符(例如<<>> ,可以使用負向超前:

('.*?'|(?!\+|-|\*|/|<<|>>)[^'])*

這意味着在我們不查看+-*/<<>>的點上找到帶引號的字符串或非引號字符,並找到零次或多次。

計划是將lookingAt()與匹配器一起使用來查找操作數,然后使用lookingAt()來查找運算符,然后來回移動。 (或者,如果您根本不需要保留運算符,請使用@hwnd的答案中的find() 。)

注意:我尚未測試。 我可能有一些細節錯誤,但這應該使您對最佳方法有所了解。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM