在Regex模式匹配中使用Enumeration

时间:2017-02-10 02:59:04

标签: scala

我写了这段代码

object Foo extends Enumeration {
  val X = Value("X")
  val Y = Value("Y")
}

val regex = """([A-Z]+)(\d+)""".r
val input = "ABC123"

input match {
  case regex(x, num) if x == Foo.X.toString => // do something
  case regex(x, num) if x == Foo.Y.toString => // do something
  case _ => // throw error
}

这有效,但有点过于冗长。我试图将其改为

input match {
  case regex(`Foo.X.toString`, num) => // do something
  case regex(`Foo.Y.toString`, num) => // do something
  case _ => // throw error
}

但是这不能编译。那些'为`" vals"但不是枚举。

1 个答案:

答案 0 :(得分:2)

在我看来有人要求这个功能,除了大多数人现在避免使用Enumeration:

package abc.com.please;

import android.content.pm.PackageManager;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;


public class MainActivity extends AppCompatActivity {

private static MediaRecorder mediaRecorder = new MediaRecorder();
private static MediaPlayer mediaPlayer;

private static String audioFilePath;
private static Button stopButton;
private static Button playButton;
private static Button recordButton;

private boolean isRecording = false;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    recordButton = (Button) findViewById(R.id.recordButton);
    playButton = (Button) findViewById(R.id.playButton);
    stopButton = (Button) findViewById(R.id.stopButton);

    if (!hasMicrophone())
    {
        stopButton.setEnabled(false);
        playButton.setEnabled(false);
        recordButton.setEnabled(false);
    } else {
        playButton.setEnabled(false);
        stopButton.setEnabled(false);
    }

    audioFilePath =
            Environment.getExternalStorageDirectory().getAbsolutePath()
                    + "/myaudio.3gp";


    recordButton.setOnClickListener(new View.OnClickListener(){

        public void onClick (View v)
        {

            isRecording = true;
            stopButton.setEnabled(true);
            playButton.setEnabled(false);
            recordButton.setEnabled(false);

            try {
                mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                                   mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
                mediaRecorder.setOutputFile(audioFilePath);
                  mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                mediaRecorder.prepare();
                mediaRecorder.start();
            }catch (Exception e) {
                e.printStackTrace();

            }



        }
    });

    stopButton.setOnClickListener(new View.OnClickListener() {
        public void onClick (View view)
        {

            stopButton.setEnabled(false);
            playButton.setEnabled(true);
            if (isRecording)
            {
                recordButton.setEnabled(false);
                isRecording = false;
                mediaRecorder.stop();
                mediaRecorder.release();
                recordButton.setEnabled(true);
            }
            else
            {
                Toast.makeText(getApplicationContext(),"No recording going      on",Toast.LENGTH_SHORT).show();
            }
        }});

    playButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view)

        {

            playButton.setEnabled(false);
            recordButton.setEnabled(false);
            stopButton.setEnabled(true);
            try {
                mediaPlayer = new MediaPlayer();
                mediaPlayer.setDataSource(audioFilePath);
                mediaPlayer.prepare();
                mediaPlayer.start();
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    });
}

protected boolean hasMicrophone() {
    PackageManager pmanager = this.getPackageManager();
    return pmanager.hasSystemFeature(
            PackageManager.FEATURE_MICROPHONE);
}








}

注意从任意字符串构造正则表达式的危险:

scala> object E extends Enumeration {
     |   val X, Y = Value
     |   def unapply(s: String): Option[Value] = values.find(_.toString == s)
     | }
defined object E

scala> val r = "([A-Z]+)".r
r: scala.util.matching.Regex = ([A-Z]+)

scala> "Y" match { case r(E(e)) => e }
res0: E.Value = Y

scala> "Y" match { case r(E(E.Y)) => }