在Mathematica中使字符串操作更方便

Mr.*_*ard 3 string wolfram-mathematica

有了Mathematica,我总觉得字符串是"二等公民".与诸如PERL之类的语言相比,必须兼顾大量代码才能完成相同的任务.

可用的功能还不错,但语法不舒服.虽然有一些简写形式,如<>StringJoin~~StringExpression,大部分的字符串功能缺乏这样的语法,并使用笨拙的名称,如:StringReplace,StringDrop,StringReverse,Characters,CharacterRange,FromCharacterCode,和RegularExpression.

在Mathematica中,字符串像数学对象一样处理,允许5 "a" + "b"在哪里"a""b"充当符号.这是一个我不会改变的功能,即使这不会破坏代码堆栈.然而,它排除了某些简洁的字符串语法,其中例如5 "a" + "b"将呈现表达式"aaaaab".


在Mathematica中使字符串操作更方便的最佳方法是什么?

想到的想法,无论是单独的还是组合的,都是:

  1. 超载现有的功能来处理字符串,例如Take,Replace,Reverse.

    • 这是Sasha回答的问题的原始主题.它被认为是不可取的.

  2. 使用缩写名称作为字符串函数,例如StringReplace>> StrRpl,Characters>> Chrs,RegularExpression>>"RegEx"

  3. 为字符串函数创建新的中缀语法,并可能创建新的字符串操作.

  4. 为字符串创建一个新容器,例如str["string"],然后为各种函数定义.(这是由Leonid Shifrin提出的.)

  5. 的变量(4)中,展开字符串(自动?)的字符,例如"string">> str["s","t","r","i","n","g"]使得字符可以由可以看出Part,Take

  6. 从Mathematica中调用另一种语言,如PERL来处理字符串处理.

  7. 创建新的字符串函数,集合常用的操作序列.

Sas*_*sha 5

我认为这些操作具有String*名称的原因是它们与列表对应物相比具有微小的差异.具体比较CasesStringCases.

现在实现你想要的方法是这样做:

Begin["StringOverload`"];
{Drop, Cases, Take, Reverse};
Unprotect[String];
ToStringHead[Drop] = StringDrop;
ToStringHead[Take] = StringTake;
ToStringHead[Cases] = StringCases;
ToStringHead[Reverse] = StringReverse;
String /: 
 HoldPattern[(h : Drop | Cases | Take | Reverse)[s_String, rest__]] :=
  With[{head = ToStringHead[h]}, head[s, rest]]
RemoveOverloading[] := 
 UpValues[String] = 
  DeleteCases[UpValues[String], 
   x_ /; ! FreeQ[Unevaluated[x], (Drop | Cases | Take | Reverse)]]
End[];
Run Code Online (Sandbox Code Playgroud)

您可以使用Getor 加载内容Need,并RemoveOverloading[]使用正确的上下文删除带有调用的重载.

In[21]:= Cases["this is a sentence", RegularExpression["\\s\\w\\w\\s"]]

Out[21]= {" is "}

In[22]:= Take["This is dangerous", -9]

Out[22]= "dangerous"

In[23]:= Drop["This is dangerous", -9]

Out[23]= "This is "
Run Code Online (Sandbox Code Playgroud)

不过,我不认为这样做是正确的方法.您可以考虑在某些上下文中引入较短的符号,这些符号会自动评估为String*符号