如何在电源自动化中多次出现的字符之前获取字符串

How to get string before a character appearing multiple times in power automate

我有这个字符串,我需要在我的日期值开始之前获取第一个字符。例如,如果我的名字是 ZXDER_20201209220430Z,我需要 ZXDER,如果我的名字是 ZXDDFR_IUT_23_20201209220430Z,我需要 ZXDDFR_IUT_23。我如何在 Power automate 中执行此操作。最后一个下划线后的值将始终是日期值。

肯定有更有效的方法来实现这一点,但我认为它会帮助您更好地理解实际发生的事情。代码在屏幕截图下方。这不需要两个变量之间有任何不同。我只是展示了它们如何使用相同的逻辑。

GetAfterUnderScoreStringTest1 =

@{lastIndexOf(variables('StringTest1'), '_')}

GetAfterLastUnderScoreStringTest2 =

@{lastIndexOf(variables('StringTest2'), '_')}

LengthOfString1 =

@{length(variables('StringTest1'))}

LengthOfString2

@{length(variables('StringTest2'))}

String1Delta =

@{sub(variables('LengthOfString1'),variables('GetAfterUnderScoreStringTest1'))}

String2Delta =

@{sub(variables('LengthOfString2'),variables('GetAfterLastUnderScoreStringTest2'))}

字符串 1 =

@{substring(variables('StringTest1'),variables('GetAfterUnderScoreStringTest1'),variables('String1Delta'))}

字符串 2 =

@{substring(variables('StringTest2'),variables('GetAfterLastUnderScoreStringTest2'),variables('String2Delta'))}

简要回答

使用带有 split()take() 函数的表达式,在用下划线将字符串拆分为数组后获取字符串的第一部分。然后 join() 带下划线的结果。


详情

这个表达式一次性完成:

join(take(split(triggerBody()['text'], '_'), sub(length(split(triggerBody()['text'], '_')), 1)), '_')

细分

  1. split(triggerBody()['text'], '_') 根据字符串中的每个下划线将文本拆分为 JSON 数组。
  2. 为了知道该数组有多长,必须在 length() 函数中再次进行拆分。
  3. length() 计算在 sub() 函数中用于从数组中的总项目中减去 1。
  4. sub() 函数提供表达式将从数组中 take() 的项目总数。
  5. 最后,join() 函数将所有项目放入新创建的 take() 数组中以创建一个全新的字符串。

一段时间以来,我一直在打开和关闭数组来解析文本,而且我通常更喜欢它而不是使用 substring(),但它并不认为子字符串方法是一个有效的选择。通常,与较长的文本一样,它们更合适。


显然你可以把它变得更复杂,例如:

  1. 通过在日期之后添加数据,这意味着您需要确定一个 日期字符串。
  2. 或者,如果是我,我可能会添加失败分支来处理该字符串中的错误。

您也可以不使用任何表达式,或者只使用非常简单的表达式,以便以后管理流程的人员能够轻松理解。您只需要将表达式转录到流连接器中即可。

不过,我相信这可以满足您的要求,(当您说“在 Power Automate 中执行一次”时)的意思是一次性完成。