RegEx用于删除定界符之前和之后的所有内容

时间:2019-05-24 16:44:31

标签: regex regex-negation regex-lookarounds regex-group regex-greedy

我正在尝试使用正则表达式删除两个|分隔符之前和之后的所有内容。

一个例子是:

EM|CX-001|Test Campaign Name

并获取除CX-001以外的所有内容。我不能使用子字符串,因为管道前后的字符数可能会更改。

我尝试使用正则表达式(?<=\|)(.*?)(?=\-),但是虽然选择了CX-001,但我需要选择除此以外的所有内容。

如何解决此问题?

3 个答案:

答案 0 :(得分:1)

  • 查找:^[^|]*\|([^|]+).+$
  • 替换:$1

答案 1 :(得分:1)

如果字符串中只有2个管道,则可以匹配第一个管道,也可以从最后一个管道匹配到字符串的结尾:

  SpreadsheetApp.getUi() 
      .createMenu('Custom Menu')
      .addItem('Show alert', 'showAlert')
      .addToUi();
}

function AskUser() {
  var ui = SpreadsheetApp.getUi(); 

  var result = ui.alert(
     'Worksheet Protected!',
     'Do you want to unprotect the worksheet?',
      ui.ButtonSet.YES_NO);


  if (result == ui.Button.YES) {
    //This is where I want the password dialogue box prompt
    ui.alert('The worksheet will be unprotected after you submit the right password.');
  } else {

    ui.alert('The worksheet will not be unprotected.');
  }
}

说明

  • ^.*?\||\|.*$ 从字符串非贪婪开始到第一个管道匹配
  • ^.*?\|
  • |从最后一个管道匹配到字符串结尾

Regex demo

或者您也可以使用否定的字符类\|.*$而不需要捕获组:

[^|]*

Regex demo

注意

在您的模式^[^|]*\||\|[^|]*$ 中,我想表示的是,如果要在2个管道之间进行选择,则最后一个正向提前应为(?<=\|)(.*?)(?=\-)而不是(?=\|)

答案 2 :(得分:0)

您可以尝试以下正则表达式:

(^[^|]*\|)|(\|[^|]*$)
    String input = "EM|CX-001|Test Campaign Name";

    System.out.println(
        input.replaceAll("(^[^|]*\\|)|(\\|[^|]*$)", "")
    );  // prints "CX-001"

正则表达式的解释:

NODE                     EXPLANATION
--------------------------------------------------------------------------------
  (                        group and capture to \1:
--------------------------------------------------------------------------------
    ^                        the beginning of the string
--------------------------------------------------------------------------------
    [^|]*                    any character except: '|' (0 or more
                             times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
    \|                       '|'
--------------------------------------------------------------------------------
  )                        end of \1
--------------------------------------------------------------------------------
 |                        OR
--------------------------------------------------------------------------------
  (                        group and capture to \2:
--------------------------------------------------------------------------------
    \|                       '|'
--------------------------------------------------------------------------------
    [^|]*                    any character except: '|' (0 or more
                             times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
    $                        before an optional \n, and the end of
                             the string
--------------------------------------------------------------------------------
  )                        end of \2